2012-10-29 2 views
16

도움말 -> 정보 응용 프로그램 메뉴에서 호출 한 간단한 '정보'모달 대화 상자를 만들고 싶습니다. QT Creator (.ui 파일)로 모달 대화 상자 창을 만들었습니다.Qt는 메뉴 항목에서 모달 대화 상자 (.ui)를 보여줍니다.

'코드'슬롯에 어떤 코드가 있어야합니까? (내 about.ui을 기반으로하지)

지금이 코드를 가지고 있지만, 그것은 새로운 모달 대화 상자를 보여줍니다

void MainWindow::on_actionAbout_triggered() 
{ 
    about = new QDialog(0,0); 
    about->show(); 
} 

감사합니다!

답변

26

.ui 파일의 UI로 대화 상자를 설정해야합니다. Qt uic 컴파일러는 코드에 포함해야하는 .ui 파일의 헤더 파일을 생성합니다. .ui 파일의 이름이 about.ui이고 대화 상자의 이름이 About이라고 가정하면 uicUi_About 클래스를 포함하는 ui_about.h 파일을 만듭니다. 설정하여 UI에 대한 다른 접근 방법이 간단한에서 당신이 더 나은 방법이 더 잘 대화 상자를 캡슐화하기 때문에 당신이 내 특정 대화 상자에 고유 한 모든 기능을 구현할 수 있도록, 상속을 사용하는 것입니다

#include "ui_about.h" 

... 

void MainWindow::on_actionAbout_triggered() 
{ 
    about = new QDialog(0,0); 

    Ui_About aboutUi; 
    aboutUi.setupUi(about); 

    about->show(); 
} 

을 할 수있다 서브 클래스 :

AboutDialog.h :

#include <QDialog> 
#include "ui_about.h" 

class AboutDialog : public QDialog, public Ui::About { 
    Q_OBJECT 

public: 
    AboutDialog(QWidget * parent = 0); 
}; 

AboutDialog.cpp :

AboutDialog::AboutDialog(QWidget * parent) : QDialog(parent) { 

    setupUi(this); 

    // perform additional setup here ... 
} 

사용법 : 어떤 경우

#include "AboutDialog.h" 

... 

void MainWindow::on_actionAbout_triggered() { 
    about = new AboutDialog(this); 
    about->show(); 
} 

는 중요한 코드는 setupUi() 메소드를 호출하는 것입니다.

BTW : 위 코드의 대화 상자는 넌 모달입니다. 모달 대화 상자를 표시하려면 대화 상자의 windowModality 플래그를 Qt::ApplicationModal으로 설정하거나 show() 대신 exec()을 사용하십시오.

+0

감사합니다. Andreas! 가장 간단한 방법을 간다 ... 사실은 ui_about.h가 생성되지 않았으며 현재는 미리 설정되어 있지 않다는 것입니다. 그래서 처음에 지정한 코드를 가진 프로젝트는 컴파일되지 않습니다. 수동으로 ui_about.h를 생성하는 방법이 있습니까? –

+1

'uic about.ui -o ui_about.h'를 사용하여 수동으로 생성 할 수 있습니다. 그러나 당신의 빌드 시스템은 그것을 처리해야한다 -'FORMS = about.ui'가'.pro' 파일에 포함되어 있는지 확인하십시오. –

+0

.pro 파일에 이상한 항목이 있습니까? 얼마 전에 비슷한 리소스 파일이 생성되지 않는 문제가있었습니다. http://stackoverflow.com/questions/12380171/qmake-not-generating-binary-resource-files/12431570#12431570 –

4

모달 대화 상자의 경우 exec() QDialogs 방법을 사용해야합니다.

about = new QDialog(0, 0); 

// The method does not return until user closes it. 
about->exec(); 

// In this point, the dialog is closed. 

Docs

말 :

가장 일반적인 방법은 모달 대화가 exec() 함수를 호출하는 것입니다 표시합니다. 사용자가 대화 상자를 닫으면 exec()이 유용한 반환 값을 제공합니다.


대체 방법 : 당신은 모달 대화가 필요하지 않습니다 . 다이얼로그가 모덜리스로 보이게하고 accepted()rejected() 신호를 적절한 슬롯에 연결하십시오.그런 다음 show() 다음에 코드를 넣는 대신 슬롯을 모두 넣을 수 있습니다. 따라서이 방법을 사용하면 실제로는 모달 대화 상자가 필요하지 않습니다.