Russian Qt Forum
Ноябрь 01, 2024, 20:21 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Интерактивное окно и QMesssageBox. Как?  (Прочитано 5189 раз)
hordi1
Гость
« : Декабрь 20, 2010, 11:51 »

Есть необходимость показывать одно окно (для отображения лога) при любой ситуации в аппликухе, т.е. даже если показывается QMessageBox. Это окно должно взаимодействовать с мышью-клавишами (например, после того как в него тыкнули курсором)...
Попробовал установить флаги  setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint) и setWindowModality(Qt::ApplicationModal) - работает если окно показывается после отображения QMessageBox, но если оно было отображено до показа QMessageBox - получить ввод на него уже нельзя.

Qt-4.7.1
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 20, 2010, 12:08 »

Не устанавливай ему родителя.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hordi1
Гость
« Ответ #2 : Декабрь 20, 2010, 12:15 »

Я не устанавливаю - это не имеет значения.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 20, 2010, 12:58 »

По идее, окно без родителя является самостоятельным и никакие QMessageBox не должны на него влиять. Попробуй сделать setParent (0).
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
hordi1
Гость
« Ответ #4 : Декабрь 20, 2010, 13:42 »

Да почему это? Диалог есть диалог, он блокирует аппликуху.

В общем решил проблему...

Устанавливаем окну флаги:

setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint);
setWindowModality(Qt::WindowModal);

Затем в QApplication::notify отлавливаем QEvent::Show для всех диалогов и с помощью postEvent делаем hide() и show() для лог-окна (это для того чтобы избавится от модальности текущего QDialog).
Записан
andrew.k
Гость
« Ответ #5 : Декабрь 20, 2010, 18:08 »

Да почему это? Диалог есть диалог, он блокирует аппликуху.

В общем решил проблему...

Устанавливаем окну флаги:

setWindowFlags(Qt::Window|Qt::WindowStaysOnTopHint);
setWindowModality(Qt::WindowModal);

Затем в QApplication::notify отлавливаем QEvent::Show для всех диалогов и с помощью postEvent делаем hide() и show() для лог-окна (это для того чтобы избавится от модальности текущего QDialog).

Так зачем вообще делать его модальным, чтобы потом отлавливать и избавляться от модальности? не понимаю.
Покажи его show() и все. Что тебе еще от него нужно?
Записан
hordi1
Гость
« Ответ #6 : Декабрь 20, 2010, 20:35 »

Показываем окно (пусть через show()), вызываем QMessageBox::warning - все, до момента закрытия мессаджбокса с тем окном ВЗАИМОДЕЙСТВОВАТЬ нельзя.
Записан
andrew.k
Гость
« Ответ #7 : Декабрь 20, 2010, 21:45 »

Понятно Улыбающийся
Ну так мессаджбокс на то и мессаджбокс, чтобы пользователь на него сразу отреагировал, на то он и модальный, а если его можно проигнорировать, так зачем он нужен?
Записан
hordi1
Гость
« Ответ #8 : Декабрь 21, 2010, 20:22 »

Ну почему же... Лог-окно в данном случае отвязано от логики работы программы и не должно мешать выполнению программы.
Записан
andrew.k
Гость
« Ответ #9 : Декабрь 22, 2010, 12:03 »

Это не противоречит тому, что я сказал.
Я все равно сначала отвечу на вопрос программы, а потом полезу смотреть лог, если мне это будет нужно.
Думаю ты сделаешь точно так же, в этой ситуации.
А твой подход заставляет тебя идти на извращения, ради непонятной эфемерной "отвязности лога от логики программы".
Либо запусти лог отдельным процессом и не мучайся.
Записан
hordi1
Гость
« Ответ #10 : Декабрь 22, 2010, 17:07 »

   Дело в том, часто программа не позволяет ничего делать пока не выполнятся базовые действия. У меня ищутся определенные данные на флешках перед запуском программы, т.е. показывается модальное окно с индикацией ожидания, в это время монтируются флешки и ищутся данные, замтем если не найдено - показывается мессага с сообщением закрыть программу или повторить. Вот этот случай и не позволяет так просто использовать лог-окно.
   Отдельным процессом думал, но получается еше геморнее - это надо межпроцессное взаимодействие включать и массу других фишек учитывать (например у меня меня аппликуха работает в полноэкранном режиме).
    Моя реализация позволила прикрутить окно с логом абсолютно к любой моей программе без всякой модификации, т.е. все работает на уровне базового класса, определенного от QAppliction.
Записан
andrew.k
Гость
« Ответ #11 : Декабрь 22, 2010, 18:12 »

Кинь скриншот как это выглядит, а то я не очень понял.
Например, можно написать в окне лога соответствующее сообщение: "ничего не найдено, либо выходите либо ищите снова".
А как выходить и искать пользователь в курсе. Улыбающийся
Если тебе вообще интересно это обсуждать.
Межпроцессное взаимодействие например через сокеты сделать один час нужно, имхо, если тупо и по-простому.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 22.