2012-10-29 7 views
16

Ich möchte einen einfachen 'About' modalen Dialog, von Hilfe-> Über das Anwendungsmenü aufgerufen. Ich habe ein modales Dialogfenster mit QT Creator (.ui Datei) erstellt.Qt show modal dialog (.ui) auf Menüpunkt klicken

Welcher Code sollte im Menü 'Über' Slot sein?

Jetzt habe ich diesen Code, aber es zeigt einen neuen modalen Dialog (nicht auf meinem about.ui basiert):

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

Dank!

Antwort

26

Sie müssen den Dialog mit der Benutzeroberfläche aus Ihrer Datei .ui einrichten. Der Qt uic Compiler generiert eine Header-Datei aus Ihrer .ui Datei, die Sie in Ihren Code aufnehmen müssen. Angenommen, Ihre .ui Datei heißt about.ui, und der Dialog heißt About, dann erstellt uic die Datei ui_about.h, die eine Klasse Ui_About enthält. Es gibt verschiedene Ansätze die Benutzeroberfläche einrichten, bei einfachsten Sie

#include "ui_about.h" 

... 

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

    Ui_About aboutUi; 
    aboutUi.setupUi(about); 

    about->show(); 
} 

Ein besserer Ansatz tun können, ist die Vererbung zu verwenden, da es Ihre Dialoge besser kapselt, so dass Sie jede Funktionalität speziell für den bestimmten Dialog umsetzen können innerhalb der Unterklasse:

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 ... 
} 

Verbrauch:

#include "AboutDialog.h" 

... 

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

In jedem Fall ist der wichtige Code ist die setupUi() Methode aufzurufen.

BTW: Ihr Dialog im obigen Code ist nicht modal. Um einen modalen Dialog anzuzeigen, setzen Sie entweder das windowModality Flag Ihres Dialogs auf Qt::ApplicationModal oder verwenden Sie exec() anstelle von show().

+0

Danke, Andreas! Der einfachste Weg für den Moment ... Tatsache ist, dass das ui_about.h nicht erstellt wurde und jetzt nicht voreingestellt ist. Also das Projekt mit dem Code, den Sie zuerst angegeben haben, kompiliert nicht. Gibt es eine Möglichkeit, ui_about.h manuell zu erstellen? .. –

+1

Sie können es manuell mit 'uic about.ui -o ui_about.h' erstellen. Aber Ihr Build-System sollte sich darum kümmern - stellen Sie sicher, dass 'FORMS = about.ui' in Ihrer' .pro' Datei enthalten ist. –

+0

Haben Sie seltsame Einträge in der .pro-Datei? Es gab ein ähnliches Problem vor einiger Zeit mit Ressourcen-Dateien nicht erstellt werden: http://StackOverflow.com/Questions/12380171/qmake-not-generating-binary-Resource-Files/12431570#12431570 –

4

Für modale Dialoge sollten Sie exec() Methode von QDialogs verwenden.

about = new QDialog(0, 0); 

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

// In this point, the dialog is closed. 

Docs sagen:

Die häufigste Art und Weise ein modaler Dialog anzuzeigen ist seine exec() Funktion aufzurufen. Wenn der Benutzer den Dialog schließt, liefert exec() einen nützlichen Rückgabewert.


Alternative Art und Weise: Sie nicht einen modalen Dialog brauchen. Lassen Sie den Dialog modeless anzeigen und verbinden Sie seine Signale accepted() und rejected() mit den entsprechenden Steckplätzen.Dann können Sie Ihren gesamten Code in den akzeptieren Steckplatz statt sie direkt nach show() setzen. Auf diese Weise benötigen Sie keinen modalen Dialog.