How can I change the modality of QDialog at runtime?

c++, modality, qdialog, qt

Solution

You can use either`QDialog::setModal(bool)` or `setWindowModality(Qt::ApplicationModal)`. But the documentation of `setWindowModality()` says something extra which is..

Changing this property while the window is visible has no effect;
you must hide() the widget first, then show() it again.

So your code should look like following..

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

Problem

I have a QDialog and I read a lot about the differences of show(), exec() and open(). Unfortunately I never found a solved solution to change the modality of a dialog at runtime. I have an application and from there my QDialog is started. I have a toggle button in this dialog and with clicking on it the QDialog should change the modality,so that it is possible to interact with the application - but this shouldn't happen all the time - just when the toggle button is checked. Is there a possibility? I could not solve the problem with setting setModal(true/false) this just allows me to start it modal, toggle the button and set it to non modal, but then I can't go back to modal. Here some code: Starting the dialog: from the main window: ``` _dialog = new ToggleModalDialog(this, id, this); _dialog->setWindowModality(Qt::ApplicationModal); _dialog->open(); ``` and here in the toggled slot in the 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); } ``` Thanks in advance!

Original source