web-dev-qa-db-fra.com

Qt afficher la boîte de dialogue modale (.ui) sur l'élément de menu, cliquez sur

Je veux créer une simple boîte de dialogue modale "À propos", appelée depuis le menu Aide-> À propos de l'application. J'ai créé une fenêtre de dialogue modale avec QT Creator (fichier .ui).

Quel code doit être dans le menu "À propos" de l'emplacement?

Maintenant, j'ai ce code, mais il affiche une nouvelle boîte de dialogue modale (non basée sur mon about.ui):

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

Merci!

23
Michael Zelensky

Vous devez configurer la boîte de dialogue avec l'interface utilisateur vous à partir de votre fichier .ui. Le compilateur Qt uic génère un fichier d'en-tête à partir de votre fichier .ui Que vous devez inclure dans votre code. Supposons que votre fichier .ui Est appelé about.ui, Et que la boîte de dialogue est nommée About, puis uic crée le fichier ui_about.h, Contenant une classe Ui_About. Il existe différentes approches pour configurer votre interface utilisateur, au plus simple vous pouvez le faire

#include "ui_about.h"

...

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

    Ui_About aboutUi;
    aboutUi.setupUi(about);

    about->show();
}

Une meilleure approche consiste à utiliser l'héritage, car il encapsule mieux vos boîtes de dialogue, afin que vous puissiez implémenter toute fonctionnalité spécifique à la boîte de dialogue particulière dans la sous-classe:

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

tilisation:

#include "AboutDialog.h"

...

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

Dans tous les cas, le code important est d'appeler la méthode setupUi().

BTW: Votre boîte de dialogue dans le code ci-dessus n'est pas modale. Pour afficher une boîte de dialogue modale, définissez le drapeau windowModality de votre boîte de dialogue sur Qt::ApplicationModal Ou utilisez exec() au lieu de show().

37
Andreas Fester

Pour les boîtes de dialogue modales, vous devez utiliser la méthode exec() de 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 dites:

La façon la plus courante d'afficher une boîte de dialogue modale est d'appeler sa fonction exec(). Lorsque l'utilisateur ferme la boîte de dialogue, exec() fournira une valeur de retour utile.


Autre moyen: vous n'avez pas besoin d'une boîte de dialogue modale. Laissez la boîte de dialogue afficher non modale et connectez ses signaux accepted() et rejected() aux emplacements appropriés. Ensuite, vous pouvez placer tout votre code dans l'emplacement accepter au lieu de les placer juste après show(). Ainsi, en utilisant cette méthode, vous n'auriez pas réellement besoin d'une boîte de dialogue modale.

5
frogatto