2012-05-25 2 views
4

У меня есть QDialog, и я много читаю о различиях show(), exec() и open(). К сожалению, я так и не нашел решение для изменения модальности диалога во время выполнения. У меня есть приложение, и оттуда запускается мой QDialog. У меня есть кнопка переключения в этом диалоговом окне, и при нажатии на нее QDialog должен изменить модальность, чтобы можно было взаимодействовать с приложением - но это не должно происходить все время - только при проверке кнопки переключения.Как изменить модальность QDialog во время выполнения?

Есть ли возможность? Я не мог решить проблему с установкой setModal (true/false), это просто позволяет мне запустить ее модально, переключить кнопку и установить ее в немодальную, но тогда я не могу вернуться к модальному.

Вот некоторые код:

Начиная диалог:

из главного окна:

_dialog = new ToggleModalDialog(this, id, this); 
_dialog->setWindowModality(Qt::ApplicationModal); 
_dialog->open(); 

и здесь в переключаемых слот в ToggleModalDialog

void ToggleModalDialog::changeModality(bool checkState) 
{ 
    if(checkState) 
    { 
     this->setWindowModality(Qt::NonModal); 
     ui->changeModalityButton->setChecked(true); 
     this->setModal(false); 
    } 
    else 
    { 
     this->setWindowModality(Qt::ApplicationModal); 
     ui->changeModalityButton->setChecked(true); 
    } 

Спасибо заранее!

ответ

8

Вы можете использовать либо QDialog::setModal(bool), либо setWindowModality(Qt::ApplicationModal). Но документация setWindowModality() говорит что-то дополнительное, который ..

Changing this property while the window is visible has no effect; 
you must hide() the widget first, then show() it again. 

Так что ваш код должен выглядеть так ..

void ToggleModalDialog::changeModality(bool checkState) 
{ 
    if(checkState) 
    { 
     this->setWindowModality(Qt::NonModal); 
     ui->changeModalityButton->setChecked(true); 
    } 
    else 
    { 
     this->setWindowModality(Qt::ApplicationModal); 
     ui->changeModalityButton->setChecked(true); 
    } 

    this->hide(); 
    this->show(); 
}