4

我有一个 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);
    }

提前致谢!

4

1 回答 1

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();
}
于 2012-05-25T09:38:59.303 回答