Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: hordi1 от Декабрь 20, 2010, 11:51



Название: Интерактивное окно и 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
Кинь скриншот как это выглядит, а то я не очень понял.
Например, можно написать в окне лога соответствующее сообщение: "ничего не найдено, либо выходите либо ищите снова".
А как выходить и искать пользователь в курсе. :)
Если тебе вообще интересно это обсуждать.
Межпроцессное взаимодействие например через сокеты сделать один час нужно, имхо, если тупо и по-простому.