QMessageBox блокирует QDialog - PullRequest
2 голосов
/ 17 июня 2011

На самом деле я не знаю, как сформулировать свой вопрос ...

У меня есть приложение с QDialog в качестве главного окна.Приложение получает разные значения, такие как температура, влажность и т. Д. С удаленного компьютера.

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

Например, если температура поднимается выше 30 ° C, я открываю QMessageBox со временем запроса (приложение выполняет опрос на удаленном компьютере) и текущимтемпературы.Так что это обновляется каждый цикл запроса.

Я использую метод show (), чтобы вызвать окно сообщения, которое поддерживает работу моего приложения в фоновом режиме.Теперь проблема в том, что фокус находится на окне сообщения, и ничего в моем главном окне / QDialog нельзя щелкать, пока окно сообщения не будет принято / не завершено.

И это моя проблема: в режиме имитации я хочупоиграть с различными значениями температуры, которые я могу настроить с помощью ползунка в главном окне.Как я могу получить доступ к этим виджетам / сделать окно сообщений каким-то образом "не блокирующим"?

С уважением,

Матиас

Ответы [ 2 ]

8 голосов
/ 17 июня 2011

То, что вы испытываете, называется «модальностью» окна.По умолчанию QMessageBox является "модальным приложением".Это означает, что ввод во все другие окна приложения заблокирован.

Чтобы изменить модальность, используйте setWindowModality () со значением из Qt :: WindowModality непосредственно перед вамиЗвоните show().В вашем случае:

box->setWindowModality(Qt::NonModal);
box->show();
0 голосов
/ 17 июня 2011

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

Теперь, если вы установите модальность окна сообщения на Qt :: NonModal, (не забудьте назначить его переменной, которая не выйдет из области видимости, когда ваше приложение продолжит работу после появления окна сообщения), вы сможете взаимодействовать с пользовательским интерфейсом, даже когда отображается окно сообщения. Я должен сказать, что это «необычно». Если я понимаю ваше требование, у вас уже будет окно с сообщением вверх - тогда, пока оно все еще работает, вы захотите поэкспериментировать с различными значениями температуры в главном окне - с какой целью? Пока не появится другое диалоговое окно сообщения? В какой-то момент окно сообщения будет отброшено.

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

Я бы предположил, что окна сообщений, как правило, обрабатываются как предполагалось - только временные, временные модальные окна предупреждений и что, возможно, вам требуется четко видимая область живого отчета / состояния в главном окне, а не немодальный QMessageBox.

Надеюсь, это поможет

Привет

Роджер

...