Название: Интерактивное окно и QMesssageBox. Как? Отправлено: hordi1 от Декабрь 20, 2010, 11:51 Есть необходимость показывать одно окно (для отображения лога) при любой ситуации в аппликухе, т.е. даже если показывается QMessageBox. Это окно должно взаимодействовать с мышью-клавишами (например, после того как в него тыкнули курсором)...
Попробовал установить флаги setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint) и setWindowModality(Qt::ApplicationModal) - работает если окно показывается после отображения QMessageBox, но если оно было отображено до показа QMessageBox - получить ввод на него уже нельзя. Qt-4.7.1 Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: Пантер от Декабрь 20, 2010, 12:08 Не устанавливай ему родителя.
Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: hordi1 от Декабрь 20, 2010, 12:15 Я не устанавливаю - это не имеет значения.
Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: Пантер от Декабрь 20, 2010, 12:58 По идее, окно без родителя является самостоятельным и никакие QMessageBox не должны на него влиять. Попробуй сделать setParent (0).
Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: hordi1 от Декабрь 20, 2010, 13:42 Да почему это? Диалог есть диалог, он блокирует аппликуху.
В общем решил проблему... Устанавливаем окну флаги: setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint); setWindowModality(Qt::WindowModal); Затем в QApplication::notify отлавливаем QEvent::Show для всех диалогов и с помощью postEvent делаем hide() и show() для лог-окна (это для того чтобы избавится от модальности текущего QDialog). Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: andrew.k от Декабрь 20, 2010, 18:08 Да почему это? Диалог есть диалог, он блокирует аппликуху. Так зачем вообще делать его модальным, чтобы потом отлавливать и избавляться от модальности? не понимаю.В общем решил проблему... Устанавливаем окну флаги: setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint); setWindowModality(Qt::WindowModal); Затем в QApplication::notify отлавливаем QEvent::Show для всех диалогов и с помощью postEvent делаем hide() и show() для лог-окна (это для того чтобы избавится от модальности текущего QDialog). Покажи его show() и все. Что тебе еще от него нужно? Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: hordi1 от Декабрь 20, 2010, 20:35 Показываем окно (пусть через show()), вызываем QMessageBox::warning - все, до момента закрытия мессаджбокса с тем окном ВЗАИМОДЕЙСТВОВАТЬ нельзя.
Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: andrew.k от Декабрь 20, 2010, 21:45 Понятно :)
Ну так мессаджбокс на то и мессаджбокс, чтобы пользователь на него сразу отреагировал, на то он и модальный, а если его можно проигнорировать, так зачем он нужен? Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: hordi1 от Декабрь 21, 2010, 20:22 Ну почему же... Лог-окно в данном случае отвязано от логики работы программы и не должно мешать выполнению программы.
Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: andrew.k от Декабрь 22, 2010, 12:03 Это не противоречит тому, что я сказал.
Я все равно сначала отвечу на вопрос программы, а потом полезу смотреть лог, если мне это будет нужно. Думаю ты сделаешь точно так же, в этой ситуации. А твой подход заставляет тебя идти на извращения, ради непонятной эфемерной "отвязности лога от логики программы". Либо запусти лог отдельным процессом и не мучайся. Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: hordi1 от Декабрь 22, 2010, 17:07 Дело в том, часто программа не позволяет ничего делать пока не выполнятся базовые действия. У меня ищутся определенные данные на флешках перед запуском программы, т.е. показывается модальное окно с индикацией ожидания, в это время монтируются флешки и ищутся данные, замтем если не найдено - показывается мессага с сообщением закрыть программу или повторить. Вот этот случай и не позволяет так просто использовать лог-окно.
Отдельным процессом думал, но получается еше геморнее - это надо межпроцессное взаимодействие включать и массу других фишек учитывать (например у меня меня аппликуха работает в полноэкранном режиме). Моя реализация позволила прикрутить окно с логом абсолютно к любой моей программе без всякой модификации, т.е. все работает на уровне базового класса, определенного от QAppliction. Название: Re: Интерактивное окно и QMesssageBox. Как? Отправлено: andrew.k от Декабрь 22, 2010, 18:12 Кинь скриншот как это выглядит, а то я не очень понял.
Например, можно написать в окне лога соответствующее сообщение: "ничего не найдено, либо выходите либо ищите снова". А как выходить и искать пользователь в курсе. :) Если тебе вообще интересно это обсуждать. Межпроцессное взаимодействие например через сокеты сделать один час нужно, имхо, если тупо и по-простому. |