Как Qdialog.exec () возвращает

0

Я знаю, что 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() где угодно? Какие-либо предложения?

  • 0
    Что такое dialog_a ? Диалог внутри диалогового класса?
  • 0
    да это еще один диалог внутри диалога. Будет ли их закрытие влиять на диалог, в котором они находятся?
Показать ещё 1 комментарий
Теги:
qt
qdialog

1 ответ

2
Лучший ответ

Проблема заключается в этой строке: 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() возвращает (или любые вызовы, возвращаемые этим методом), ваше диалоговое окно закрывается.

  • 0
    Другими словами: exec должен возвращаться, когда диалог скрыт. В противном случае он никогда не вернется, поскольку вы не можете взаимодействовать с невидимым диалогом. Другими словами, то, что видит спрашивающий, является единственным разумным поведением.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню