c – 如何在运行时更改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);
    }

提前致谢!

最佳答案
您可以使用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();
}

转载注明原文:c – 如何在运行时更改QDialog的模态? - 代码日志