2016-07-11 3 views
1

Qt-Creator에서 만들고 편집 한 Qt 위젯 응용 프로그램이 있습니다.권장되는 QDialog 인스턴스가있는 이유는 무엇입니까?

기본 창 (MainWindow 클래스)에는 작은 대화 상자 (설정 용 텍스트 또는 위젯 포함)를 여는 버튼이있는 메뉴 모음이 있습니다.

새 "창"을 만들려면 Qt-Creator에서 "새 파일 만들기"대화 상자를 열고 필요한 헤더, 소스 및 ui 파일 (dialogabout.h, dialogabout.cpp)을 만드는 Qt 디자이너 양식 클래스를 선택하십시오. , dialogabout.ui).

나는 docs과 함께 수행하면, 그때 그렇게 같이 인 QDialog를 엽니 다

QDialog * widget = new QDialog; 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

이 작동하지만 새로운 대화의 인스를 수정하면 가까운 신호에 푸시 버튼을 연결, 연결 문을 (다른 코드와 함께) 결코 도달하지 않습니다.

DialogAbout::DialogAbout(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::DialogAbout) 
{ 
    ui->setupUi(this); 

    qDebug() << "I'm alive!"; // No output happens 
    connect(ui->pushButton_close, SIGNAL(clicked(bool)), this, SIGNAL(please_close())); // No signal created on pushbutton click. 
} 

은 내가 명시 적으로 widget = new DialogAbout(this)을하지 않은 때문이라고 생각한다. 대신에 새로운 대화 상자를 다른 방법으로 인스턴스화하면 :

DialogAbout * newwindow; 
newwindow = new DialogAbout(this); 
newwindow->exec(); 

그런 다음 connect 문과 qDebug가 작동합니다.

제 질문은 대화 상자를 만드는 데 권장되는 문서에서 벗어난 함정은 무엇입니까? 이전 인스턴스화 방법으로이 기능을 사용할 수있는 방법이 있습니까?

+0

please_close()는 SIGNAL 또는 SLOT입니까? – rflobao

답변

1

DialogAbout은 Ui :: DialogAbout과 같지 않습니다. Ui :: DialogAbout은 UI 네임 스페이스에 배치 된 빌드 클래스이며 사용자가 자동으로 만듭니다. 프로젝트에서이 파일의 이름은 "ui_dialogabout h"여야합니다.

class Ui_DialogAbout 
{ 
public: 
    QPushButton *pushButton_close; 

    void setupUi(QDialog *DialogAbout) 
    { 
     ... 
    } // setupUi 

    void retranslateUi(QDialog *DialogAbout) 
    { 
     ... 
    } // retranslateUi 

}; 
namespace Ui { 
    class DialogAbout: public Ui_DialogAbout {}; 
} // namespace Ui 

여기서 QDialog 클래스를 사용하고 Ui :: DialogAbout을 사용하여 레이아웃을 작성합니다. Ui :: DialogAbout에는 QDialog에서 구성 요소를 만드는 함수가 있습니다. 당신이 DialogAbout에 대한 인 QDialog을 전문으로하는 경우

QDialog * widget = new QDialog; 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

코드는 다음과 같아야합니다

DialogAbout * widget = new DialogAbout(); 
Ui::DialogAbout about_ui; 
about_ui.setupUi(widget); 
widget->exec(); 

그러나 setupUi()가 DialogAbout 내에서 이미, 당신은 결과를 다시 호출 할 수 없습니다 :

DialogAbout * widget = new DialogAbout(); 
widget->exec(); 
+0

저를 청소 해 주셔서 감사합니다. 두 가지 방법으로 동일한 기능을 얻는 방법을 알아 보았습니다. – ctag

관련 문제