У меня есть приложение, в котором есть несколько фоновых задач, выполняющихся не в потоках GUI, которые могут время от времени требовать некоторого взаимодействия с пользователем, поэтому они посылают сигнал основному потоку, и соответствующий слот создает диалог и показывает его пользователю , Тем временем поток задач ожидает события блокировки l oop. Как только пользователь отвечает на диалоговое окно и закрывает его, событие задачи l oop сигнализируется о завершении, и задача возобновляется.
Однако существует проблема. В потоке GUI я все еще могу использовать приложение, которое время от времени показывает некоторые модальные диалоги. Если модальное диалоговое окно уже показано, а затем фоновые задачи запрашивают открытие другого диалогового окна, это диалоговое окно, связанное с заданием, отображается перед модальным диалоговым окном. Но этот новый диалог не является модальным, и модальный диалог скрыт за ним. Поэтому немодальное не отвечает, приложение чувствует, что оно застряло.
Моя идея состояла в том, чтобы отображать новое диалоговое окно всегда позади модального диалога, которое, я полагаю, можно получить с помощью QApplication::activeModalWidget()
. Но я не знаю, как это сделать. Как я могу показать диалог позади другого диалога, но все еще перед главным окном (которое является родителем обоих диалогов)? Я попытался вызвать QApplication::activeModalWidget()->activateWindow()
после того, как я показываю немодальный, но его причины мигают windows, и, кроме того, я все еще могу щелкнуть в новом немодальном диалоге, скрывающем модальный. Так что это не идеальное решение.
Или вы видите какое-либо другое решение?
Может быть, я мог бы реализовать очередь диалогов, и как только появится какой-нибудь модальный диалог, появится новый фон Диалог, связанный с задачей, не будет отображаться, только ставится в очередь и отображается после закрытия модального диалога. Однако мне кажется, что это более подходящее решение.
Есть идеи?
ОБНОВЛЕНИЕ: Я переопределил вопрос, добавив «или после того, как он будет закрыт», потому что это работает и для меня.