Как я могу изменить модальность QDialog во время выполнения?

У меня есть QDialog, и я много читал о различиях show(), exec() и open(). К сожалению, я так и не нашел решения, чтобы изменить модальность диалога во время выполнения. У меня есть приложение, и оттуда мой 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);
    }

Заранее спасибо!

1 ответ

Решение

Вы можете использовать либо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();
}
Другие вопросы по тегам