Выбор другого QMainWindow при запуске программы, но со странным поведением QMessageBox exec () - PullRequest
0 голосов
/ 16 января 2019

Я работаю над простым приложением Qt Widget, в котором у меня есть 2 разных класса QMainWindow, которые нужно показать пользователю (на данный момент реализован только один).

Моя идея - показать окно сообщения с пользовательскими кнопками, чтобы спросить пользователя, какой режим программы будет выполняться.

Я придумал приведенный ниже код, но столкнулся со странными проблемами. Вы можете легко попробовать этот код, если создадите простой проект виджета qt.

Таким образом, проблема в том, что отображается окно сообщения и кнопки отображаются правильно. Когда пользователь выбирает «Режим отладки», правильное главное окно будет отображаться в течение доли секунды, а затем исчезает! но программа остается открытой и возврат не будет достигнут!

Для «Режима работы» отображается окно критического сообщения, но когда пользователь нажимает «ОК», все окна сообщений исчезают, но снова код возврата не достигается!

То же самое происходит для опции "Выход" ...

#include "mainwindow.h"
#include <QApplication>

#include <QMessageBox>
#include <QAbstractButton>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // At the start of the progam ask user which mode to show
    QMessageBox msgBoxModeSelection;
    msgBoxModeSelection.setIcon(QMessageBox::Question);
    msgBoxModeSelection.setText("Please select the program mode:");

    QAbstractButton* btnModeDebug = msgBoxModeSelection.addButton(
                                    "Debug Mode", QMessageBox::YesRole);
    QAbstractButton* btnModeOperation = msgBoxModeSelection.addButton(
                                    "Operation Mode", QMessageBox::NoRole);
    QAbstractButton* btnModeExit = msgBoxModeSelection.addButton(
                                    "Exit", QMessageBox::RejectRole);

    msgBoxModeSelection.exec();

    // Check which mode is being selected by user and continue accordingly
    if(msgBoxModeSelection.clickedButton() == btnModeDebug) {
        MainWindow w;
        w.show();
    } else if(msgBoxModeSelection.clickedButton() == btnModeOperation){ // Operation Mode
        //TODO implement...for now just inform user that it is not implemented
        QMessageBox::critical(nullptr, "Error", "Operation Mode is not yet implemented");
        return a.exec();
    } else if(msgBoxModeSelection.clickedButton() == btnModeExit){ // Just exit
        // Just exit the program
        QMessageBox::critical(nullptr, "Goodbye!", "Sorry to see you go :(");
        return a.exec();
    }

    return a.exec();
}

Таким образом, в основном программа исчезает, но она все еще как-то открыта и обрабатывается ... Единственный способ завершить ее - остановить отладчик или убить его процесс из операционной системы.

Итак, я хочу, чтобы отображалась правильная форма, так как здесь не было ни одного сообщения, и код возврата и выход из программы снова были нормальными!

1 Ответ

0 голосов
/ 16 января 2019

Ваше MainWindow существует только внутри оператора if. Таким образом, он разрушается, как только появляется и покидает область видимости.

Измените его, например, на ::1003*

MainWindow w;
if(msgBoxModeSelection.clickedButton() == btnModeDebug) {
    w.show();
}

или

if(msgBoxModeSelection.clickedButton() == btnModeDebug) {
    MainWindow w;
    w.show();
    return a.exec();
}
...