QMessageBox блокирует QDialog

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

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

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

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

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

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

С наилучшими пожеланиями,

Матиас


person matthias    schedule 17.06.2011    source источник


Ответы (2)


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

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

box->setWindowModality(Qt::NonModal);
box->show();
person mtvec    schedule 17.06.2011

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

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

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

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

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

С Уважением

Роджер

person Roger Attrill    schedule 17.06.2011
comment
Привет Роджер! Спасибо за ваш ответ. Ты прав. Это определенно «необычно». Я хочу получить доступ к пользовательскому интерфейсу только по причинам моделирования: это означает не чтение температуры/влажности/... с удаленного компьютера, а получение его с ползунка, к которому, в свою очередь, я хочу получить доступ. Тем не менее, пользовательский интерфейс (мой QDialog) не допускает большого взаимодействия - он отображает только разные значения/только вывод. Ввод, как я уже сказал, только для целей моделирования. - person matthias; 17.06.2011