Почему MainWindow здесь не закрывается в SLOT

Я изучаю Qt с нескольких дней. Я разрабатываю простой проект для викторины всего из 2 вопросов в Qt. В MainWindow появляется вопрос с четырьмя вариантами ответа как четыре RadioButton. Когда пользователь нажимает на правильный вариант, следующий вопрос должен отображаться как новый Dialog, а предыдущий вопрос должен быть закрыт. Итак, я написал SLOT как -

void MainWindow::on_radiobutton2_clicked()
{
    Dialog q;
    q.exec();
    MainWindow::close();
}

Но этот код не закрывает MainWindow, хотя и открывает Dialog.

Когда я изменил последовательность инструкций, как показано ниже, это сработало -

void MainWindow::on_radiobutton2_clicked()
{
    Dialog q;
    MainWindow::close();
    q.exec();
}

Итак, почему MainWindow не закрывается в первом случае?


person yuvi    schedule 20.02.2014    source источник
comment
не открывать и не закрывать диалоги. Либо обновите содержимое одного окна, либо используйте QWizard.   -  person UmNyobe    schedule 20.02.2014
comment
@UmNyobe Подскажите, пожалуйста, как обновить содержимое того же окна?   -  person yuvi    schedule 20.02.2014
comment
Есть много способов. Например, вы можете поместить QStackedWidget и переключить видимый.   -  person UmNyobe    schedule 20.02.2014
comment
Спасибо. Узнал что-то новое.. :)   -  person yuvi    schedule 20.02.2014


Ответы (2)


В следующих двух строках

q.exec();
MainWindow::close();

Диалоговое окно отображается как модальное диалоговое окно и блокирует цикл обработки событий до тех пор, пока оно не будет закрыто. Таким образом, функция close() главного окна не будет выполняться, пока вы не закроете диалоговое окно.

person vahancho    schedule 20.02.2014

Закрытие главного окна, скорее всего, приведет к ухудшению пользовательского опыта. Что вы, вероятно, хотите, так это показать модальный диалог.

Поскольку QDialog::exec() блокируется до тех пор, пока диалоговое окно не будет закрыто, вы не должны его использовать. Вместо этого просто show() диалоговое окно.

void MainWindow::on_radiobutton2_clicked()
{
    Dialog * q = new Dialog;
    q->setAttribute(Qt::WA_DeleteOnClose); // thus it won't leak
    q->setModal(true); // so that the main window doesn't have to be closed
    q->show();
}
person Kuba hasn't forgotten Monica    schedule 20.02.2014