Название: Возврат фокуса после QMessageBox::warning() Отправлено: 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. Всё-равно, кто-нибудь забудет. Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Bepec от Декабрь 15, 2011, 09:18 мб это особенность ОС?
Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Zmeishe от Декабрь 15, 2011, 09:23 Я тоже так думал.
Но для Linux это может быть особенностью оконного менеджера, а не ОС. А вот оконный менеджер и для Mandriva 2010 и для KUbuntu 10.04 одинаковый - KDE 4, а поведение разное. Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Пантер от Декабрь 15, 2011, 09:23 мб это особенность ОС? Тогда скорее особенность WM или его настроек.Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Bepec от Декабрь 15, 2011, 09:30 Полагаюсь на ваши слова, ибо в unix подобных не программировал :)
Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Zmeishe от Декабрь 15, 2011, 09:45 С другой стороны, если дело в оконном менеджере.
Оконный менеджер передал фокус тому окну, которое его имело. И менеджеру должно быть глубоко фиолетово, какому виджету внутри себя это окно передаст фокус. С точки зрения Qt, фокус должен быть передан родителю. В одной системе, если родителем для QMessageBox является вьюха - фокус ей не возвращается. А в другой системе родителем может быть даже главное окно и фокус возвращается вьюхе как надо. Короче, я запутался. Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Bepec от Декабрь 15, 2011, 09:59 Тут вопрос Handle, если я правильно помню. Фокус может возвращаться точно элементу окна, или же просто окну. (это уже как реализовали создатели менеджеров).
Название: Re: Возврат фокуса после QMessageBox::warning() Отправлено: Zmeishe от Декабрь 16, 2011, 13:20 Посмотрел, что Qt выводит в консоль в момент показа QMessageBox
На Mandriva ничего криминального. А на Kubuntu выводит сообщение про evet filter и different thread. Потом приложение может рухнуть, а может и не рухнуть. Похоже тут и зарыта собака с передачей фокуса. При чём тут different thread в одно-поточном приложении? |