QDialog закрывается самостоятельно, как я могу это исправить? - PullRequest
1 голос
/ 26 октября 2019

Мои имена классов похожи (что они делают) _ (тип), например: reg_QDialog

Вот код исполняемого dlg и, если Принят, создает QMainWindow:

if(log_dlg->exec() == QDialog::Accepted)
{
    find_wnd = new find_QMainWindow();
    find_wnd->show();
}

log_dlgимеет 2 btns: «Enter» (здесь результат принятия) и «Reg» (открывает новый dlg)

«Enter» и «Reg» код здесь:

void log_QDialog::on_btn_enter_clicked()
{
    this->accept();
}

void log_QDialog::on_btn_reg_clicked()
{
    reg_QDialog *reg_dlg = new reg_QDialog();

    this->hide();
    if(reg_wnd->exec() == QDialog::Accepted)
    {
        //code
    }
    this->show();
}

Итак, вот проблема:

Step by step:
1) run the prog    //it starts with dlg_log 
2) "Reg"           //creating dlg_reg 
3) accept dlg_reg  //returning to dlg_log 
4) "Enter"         //trying to create QMainWindow 
QMainWindow is not created, and the app just closed

После «возврата» (на самом деле это просто скрытие и отображение) из reg_dlg и нажатия btn с параметром accept ничего не происходит! Он просто закрывает программу, но должен был показать QMainWindow!

Весь реальный код main.cpp:

#include "log_window_root.h"
#include "find_mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    log_window_root * log_wnd;
    find_mainwindow * find_wnd;

    log_wnd = new log_window_root();
    log_wnd->setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint);
    log_wnd->setModal(true);

    if(log_wnd->exec() == QDialog::Accepted)
    {
        find_wnd = new find_mainwindow();
        find_wnd->setWindowFlags(Qt::MSWindowsFixedSizeDialogHint);
        find_wnd->show();
    }
    return a.exec();
}

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Вы работаете немного за пределами Qt. Глядя на документацию:

Как правило, взаимодействие с пользователем не может происходить до вызова exec (). В особом случае модальные виджеты, такие как QMessageBox, можно использовать перед вызовом exec (), потому что модальные виджеты вызывают exec () для запуска локального цикла обработки событий.

Тестирование вашего кода в Mac OS даст вамстрашное предупреждение

modalSession было преждевременно завершено - проверьте повторный входящий вызов endModalSession

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

Подумайте о переработке кода, чтобы появилось главное окно, а затем отобразите ваши диалоги. Если вы хотите продолжить с последовательностью Dialog, то удалите пару hide () / show () из on_btn_reg_clicked (эти вызовы запутывают ваши циклы событий).

1 голос
/ 26 октября 2019

QApplication закрывается, когда закрывается последнее окно. Вы можете отменить это, установив для свойства QApplication :: quitOnLastWindowClosed значение false.

    QApplication a(argc, argv);
    a.setQuitOnLastWindowClosed(false);

При желании вы можете вернуть его в прежнее состояниес этими диалогами.

Как упомянул @Jens в другом ответе на ваш вопрос, в какой-то момент это нарушит цикл, и QApplication завершит работу даже до вызова a.exec (). Таким образом, вы также можете создать нулевую ширину / высоту или вне экрана QWidget в качестве родителя ваших диалогов. A QSplashScreen также является хорошим кандидатом для этого. Все ваши диалоги должны быть вашими детьми на заставке. Наконец, вы можете завершить работу вашего заставки, вызвав QSplashScreen :: finish .

...