如何在运行时更改 QDialog 的模式

How can I change the modality of QDialog at runtime?

本文关键字:QDialog 模式 运行时      更新时间:2023-10-16

我有一个QDialog,我读了很多关于show(),exec()和open()的区别。不幸的是,我从未找到在运行时更改对话框模式的解决方案。我有一个应用程序,从那里启动了我的QDialog。我在此对话框中有一个切换按钮,单击它QDialog 应该更改模式,以便可以与应用程序交互 - 但这不应该一直发生 - 只是在选中切换按钮时。

有没有可能?我无法解决设置 setModal(真/假)的问题,这只允许我启动它模态,切换按钮并将其设置为非模态,但随后我无法返回模态。

这里有一些代码:

启动对话框:

从主窗口:

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

在切换模式对话框的切换槽中

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();
}