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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Возврат фокуса после QMessageBox::warning()  (Прочитано 4695 раз)
Zmeishe
Гость
« : Декабрь 15, 2011, 09:06 »

От чего зависит возврат фокуса?

Есть MainWindow. На нём QTabWidget.
В QTabWidget`е несколько вкладок(страниц).
На страницах QTableView`хи

Фокус имеет одна из QTableView. Пользователь чего-то там вводит, программа на лету проверяет и выводит сообщение через QMessageBox::warning().
После этого фокус возвращается на tabWidget, но никак не на tableView.

Пробовал разные варианты. Задавал в качестве родителя:
QMessageBox::warning(this, ...);
QMessageBox::warning(tabWidget, ...);
QMessageBox::warning(tableView, ...);

Фокус всё-равно не возвращается на tableView.
Только если явно указать tableView->setFocus(); сразу после любого варианта с QMessageBox::warning(...);

Автоматически он возвращается туда, где был только на Windows, на Mandriva Linux 2007 KDE 3.5 или Mandriva Linux 2010 KDE 4.

На KUbuntu GNOME/KDE без разницы - только после явного tableView->setFocus();

Уже складывается впечатление, что такое поведение зависит от версии Qt.
На Mandriva Linux 2007 Qt 4.5.1
На Mandriva Linux 2010 Qt 4.5.3
На KUbuntu 10.04 Qt 4.6.2

Что-то не очень хочется объяснять каждому разработчику, что он должен не забыть вызвать setFocus() явным образом после каждого QMessageBox.
Всё-равно, кто-нибудь забудет.
Записан
Bepec
Гость
« Ответ #1 : Декабрь 15, 2011, 09:18 »

мб это особенность ОС?
Записан
Zmeishe
Гость
« Ответ #2 : Декабрь 15, 2011, 09:23 »

Я тоже так думал.
Но для Linux это может быть особенностью оконного менеджера, а не ОС.
А вот оконный менеджер и для Mandriva 2010 и для KUbuntu 10.04 одинаковый - KDE 4, а поведение разное.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Декабрь 15, 2011, 09:23 »

мб это особенность ОС?
Тогда скорее особенность WM или его настроек.
Записан

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

Полагаюсь на ваши слова, ибо в unix подобных не программировал Улыбающийся
Записан
Zmeishe
Гость
« Ответ #5 : Декабрь 15, 2011, 09:45 »

С другой стороны, если дело в оконном менеджере.
Оконный менеджер передал  фокус тому окну, которое его имело.
И менеджеру должно быть глубоко фиолетово, какому виджету внутри себя это окно передаст фокус.
С точки зрения Qt, фокус должен быть передан родителю.
В одной системе, если родителем для QMessageBox является вьюха - фокус ей не возвращается.
А в другой системе родителем может быть даже главное окно и фокус возвращается вьюхе как надо.

Короче, я запутался.
Записан
Bepec
Гость
« Ответ #6 : Декабрь 15, 2011, 09:59 »

Тут вопрос Handle, если я правильно помню. Фокус может возвращаться точно элементу окна, или же просто окну. (это уже как реализовали создатели менеджеров).
Записан
Zmeishe
Гость
« Ответ #7 : Декабрь 16, 2011, 13:20 »

Посмотрел, что Qt выводит в консоль в момент показа QMessageBox
На Mandriva ничего криминального.
А на Kubuntu выводит сообщение про evet filter и different thread.
Потом приложение может рухнуть, а может и не рухнуть.
Похоже тут и зарыта собака с передачей фокуса.


При чём тут different thread в одно-поточном приложении?


Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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