Qt показывает модальный диалог (.ui) по щелчку элемента меню - программирование
Подтвердить что ты не робот

Qt показывает модальный диалог (.ui) по щелчку элемента меню

Я хочу сделать простой диалог "О программе", вызванный из меню "Справка" - "О приложении". Я создал модальное диалоговое окно с QT Creator (файл .ui).

Какой код должен быть в меню "О слот"?

Теперь у меня есть этот код, но он показывает новый модальный диалог (не основанный на моем about.ui):

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

Спасибо!

4b9b3361

Ответ 1

Вам необходимо настроить диалог с пользовательским интерфейсом пользователя из вашего файла .ui. Компилятор Qt uic генерирует файл заголовка из вашего файла .ui, который необходимо включить в код. Предположим, что ваш .ui файл называется about.ui, а Dialog называется About, тогда uic создает файл ui_about.h, содержащий класс Ui_About. Существуют различные подходы к настройке пользовательского интерфейса, в простейшем -

#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 или используйте exec() вместо show().

Ответ 2

Для модальных диалогов вы должны использовать метод 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.

Документы говорят:

Наиболее распространенным способом отображения модального диалога является вызов его функции exec(). Когда пользователь закроет диалог, exec() предоставит полезное возвращаемое значение.


Альтернативный способ: вам не нужен модальный диалог. Пусть диалог покажет немодальное и подключит его сигналы accepted() и rejected() к соответствующим слотам. Затем вы можете поместить весь свой код в слот accept вместо того, чтобы поместить их сразу после show(). Итак, используя этот способ, вам действительно не нужен модальный диалог.