Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Zmeishe от Декабрь 15, 2011, 09:06



Название: Возврат фокуса после 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 в одно-поточном приложении?