2017-03-23 2 views
0
/* Dialog Class */ 
class Dialog : public QDialog 
{ 
    Q_OBJECT 

public: 
    explicit Dialog(QWidget *parent = 0); 

    //void displayDialog(QString arg); //外界字符串传入到textEdit中 

    ~Dialog(); 

private: 
    Ui::Dialog *ui; 
}; 

/* MainWindow.cpp */ 
Dialog *dlg = new Dialog; 
Dialog *dlg2 = new Dialog; 

대화 상자 클래스를 기반으로 두 개의 객체를 만듭니다. * dlg 및 * dlg2 변수를 모르는 경우이 두 대화 상자를 어떻게 식별 할 수 있습니까?qt에서 개체를 어떻게 식별 할 수 있습니까?

+0

포인터에 지정하지 않고 작성하는 방법은 무엇입니까? –

답변

0

QObject을 식별하는 일반적인 방법은 QobjectobjectName 속성을 사용하는 것입니다.

이것은 매우 일반적으로 테스트에 사용되며 findChildfindChildren에 사용되는 기본 식별 양식으로 볼 수 있습니다.

편집 :

그래서 일반적으로 모든 객체는 메인 윈도우에 의해 소유 될 것입니다. 이렇게하면 Qt가 많은 것을 처리 할 수 ​​있습니다. 이 중요한 방법에 대한 몇 가지 간단한 예 :

  1. 내 모든 어린이는 파괴 될 것이다, 그래서 내 메인 윈도우는
  2. 가 저런 애 종료 후 내가 놀고 팝업이 없습니다 내 메인 창을 파괴하는 경우 창은 기본 창에서 초점을 훔쳐, 그것은 그것에서 다른 것을 방지 할 수 대화 차단 인 경우에
  3. 분명히 찾는 것을 활성화되는 현재의 계층 구조의 뜻이 너무

있습니다 여기에 중요하다 이러한 모든 기능 기능 전체 계층 구조를 통해. 즉, 메인 윈도우가 소유하고있는 QDialog에 의해 소유 된 QObject이있는 경우이 QObject은 메인 윈도우가 파괴되면 계층 구조의 다른 객체에서 포커스를 훔치고 검색하여 찾을 수 있습니다 메인 창에서 시작합니다. 이 연결되지 않은 팝업보다는

오히려는 메인 윈도우가 소유 2 팝업을 만들 수 있습니다 :

QMainWindow mainWin; 
QDialog dlg(&mainWin); 
QDialog dlg2(&mainWin); 

dlg.setObjectName("two"); 

QDialog* dfind = mainWin.findChild<QDialog*>("two"); 
+0

답변 해 주셔서 감사합니다! 하지만이 방법을 시도 : 'Dialog * dlg = new Dialog; 대화 상자 * dlg2 = 새 대화 상자; dlg2-> setObjectName (QString :: fromUtf8 ("two"))); 대화 * dfind = this-> findChild

("2");' 다음 오류 당신이 대화 상자 아이들을해야 findChild''사용하려면 –

+1

@Amor_aeternus을 "findSubDialog.exe의 작동이 중지되었습니다"입니다 'Dialog * dlg = new Dialog (this);'이 옵션이 없으면'dfind'가'NULL'이되어 사용하려고하면 응용 프로그램이 중단됩니다. –

+0

@Amor_aeternus 공동 소유주가없는 2 개의'QDialog' 디자인은 기껏해야 문제가 있습니다. 필자는 잘 설계된 Qt 프로그램이 프로그램의 다른 모든 QObject를 직접 또는 간접적으로 소유하는 유일한 'QObject'를 항상 가지고 있다는 몇 가지 중요한 이유를 가지고 나의 대답을 업데이트했다. 또한 잘 설계된 Qt 프로그램에서 어떻게 검색 결과가 작동하는지 보여주었습니다. 질문이 있으면 알려주세요. –

0

당신의 대화가 당신의 예에서와 같은 어떤 부모 (부모 == nullptr)가없는 경우, 당신이 할 수있는 모든 창을 반복하고 객체 이름을 비교합니다.

QWidget* GetWidgetByObjectName(const QString& Name) { 
    QGuiApplication* a = dynamic_cast<QGuiApplication*>(QCoreApplication::instance()); 
    if (a) { 
     for (QWidget* w : a->allWidgets()) { 
      if (w->objectName() == Name) { 
       return w; 
      } 
     } 
    } 
    return nullptr; 
} 
QDialog* Dlg = qobject_cast<QDialog*>(GetWidgetByObjectName("two")); 

그러나 대부분의 경우 상위를 할당하는 것이 좋습니다. 이 경우 이미 여기 게시 된 모든 자녀를 반복 할 수 있습니다.

관련 문제