Я знаю, что qdialog->exec()
возвращается только при qdialog->exec()
accept()
или reject()
. Однако я использую следующий код:
mydialog* p =new mydialog(this);
p->setWindowModality(Qt::WindowModal);
int return_code= p->exec() ;//Block
if(return_code==1)
{
//Called when 'accept()' is called --->Line A
}
else
{
//Called when reject is called ---> Line B
}
Теперь этот метод вызывается в mydialog
.
void mydialog::someMethod()
{
if(somecondition)
{
dialog_a->setWindowModality(Qt::WindowModal);
dialog_a->setFixedSize(dialog_a->size());
this->setVisible(false);
if(dialog_a->exec()==1)
{
qDebug() << "Dialog A selected";
}
else
{
//back button was pressesed
if(dialog_a->terminate)
{
reject();
}
else
{
this->setVisible(true); // --->Line C
}
}
}
else
{
qDebug() << "Something else selected";
}
}
Теперь вот проблема, когда вызывается вышеупомянутый метод, он заканчивается в строке C. После этого вызывается строка B. Почему это? Почему mydialog
? Я havent называл reject()
или accept()
где угодно? Какие-либо предложения?
Проблема заключается в этой строке: this->setVisible(false);
Если вы посмотрите на исходный код QDialog
, вы можете увидеть эту часть:
// Reimplemented to exit a modal event loop when the dialog is hidden.
QWidget::setVisible(visible);
if (d->eventLoop)
d->eventLoop->exit();
Поэтому, когда mydialog::someMethod()
возвращает (или любые вызовы, возвращаемые этим методом), ваше диалоговое окно закрывается.
exec
должен возвращаться, когда диалог скрыт. В противном случае он никогда не вернется, поскольку вы не можете взаимодействовать с невидимым диалогом. Другими словами, то, что видит спрашивающий, является единственным разумным поведением.
dialog_a
? Диалог внутри диалогового класса?