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 に答える