открыть диалог за модальным диалогом или после его закрытия - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть приложение, в котором есть несколько фоновых задач, выполняющихся не в потоках GUI, которые могут время от времени требовать некоторого взаимодействия с пользователем, поэтому они посылают сигнал основному потоку, и соответствующий слот создает диалог и показывает его пользователю , Тем временем поток задач ожидает события блокировки l oop. Как только пользователь отвечает на диалоговое окно и закрывает его, событие задачи l oop сигнализируется о завершении, и задача возобновляется.

Однако существует проблема. В потоке GUI я все еще могу использовать приложение, которое время от времени показывает некоторые модальные диалоги. Если модальное диалоговое окно уже показано, а затем фоновые задачи запрашивают открытие другого диалогового окна, это диалоговое окно, связанное с заданием, отображается перед модальным диалоговым окном. Но этот новый диалог не является модальным, и модальный диалог скрыт за ним. Поэтому немодальное не отвечает, приложение чувствует, что оно застряло.

Моя идея состояла в том, чтобы отображать новое диалоговое окно всегда позади модального диалога, которое, я полагаю, можно получить с помощью QApplication::activeModalWidget(). Но я не знаю, как это сделать. Как я могу показать диалог позади другого диалога, но все еще перед главным окном (которое является родителем обоих диалогов)? Я попытался вызвать QApplication::activeModalWidget()->activateWindow() после того, как я показываю немодальный, но его причины мигают windows, и, кроме того, я все еще могу щелкнуть в новом немодальном диалоге, скрывающем модальный. Так что это не идеальное решение.

Или вы видите какое-либо другое решение?

Может быть, я мог бы реализовать очередь диалогов, и как только появится какой-нибудь модальный диалог, появится новый фон Диалог, связанный с задачей, не будет отображаться, только ставится в очередь и отображается после закрытия модального диалога. Однако мне кажется, что это более подходящее решение.

Есть идеи?

ОБНОВЛЕНИЕ: Я переопределил вопрос, добавив «или после того, как он будет закрыт», потому что это работает и для меня.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я думаю, что вы ищете QWidget :: повышение () . Вы должны иметь возможность использовать QApplication::activeModalWidget()->raise() после вызова dialog->show() в своем немодальном диалоге.

Если вы попадаете в ситуации, когда у вас есть несколько модальных и немодальных диалогов, все они запускаются в разном порядке этого может быть недостаточно для решения проблемы. Вы можете вызвать один модальный диалог только для того, чтобы другие были позади других немодальных диалогов и в итоге снова застряли. Вам следует рассмотреть возможность сохранения ссылки на коллекцию модальных диалогов, которые в данный момент активны, чтобы вы могли быть уверены, что они всегда находятся поверх немодальных диалогов.

0 голосов
/ 29 апреля 2020

Я нашел решение, которое, кажется, работает хорошо и показывает немодальное диалоговое окно только после закрытия модального диалогового окна.

QWidget *nonModalDialog = ... // creates the non-modal dialog
nonModalDialog->setAttribute(Qt::WA_DeleteOnClose);
QWidget *modalDialog = qApp->activeModalWidget();
if (modalDialog == nullptr)
{
    // no modal dialog, we can show the non-modal one now
    dialog->show();
}
else
{
    // we must wait until the modal one is closed
    QObject::connect(modalDialog, &QWidget::destroyed, nonModalDialog, &QWidget::show);
}

Это кажется простым и надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...