Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: L.Marvell от Июля 15, 2005, 11:17



Название: прятание QToolBar
Отправлено: L.Marvell от Июля 15, 2005, 11:17
Всем привет!

Проблемка в следующем: есть приложение с тулбаром, а также есть меню с пунктом "показать тулбар", здесь все работает хорошо. Кликаем показать, тулбар появляется и пункт меню отмечен галочкой, убираем галочку, тулбар прячется. Но, тулбар можно спрятать через его контекстное меню и тогда естественно меню не реагирует, и остается в состоянии ON. Никак не могу понять на какой сигнал тулбара вешать собственный слот. Помогите пожалуйста.


Название: прятание QToolBar
Отправлено: lepsai от Июля 15, 2005, 12:13
void visibilityChanged ( bool visible )  (QDockWindow)


Название: прятание QToolBar
Отправлено: L.Marvell от Июля 15, 2005, 12:51
Извините, я не сказал, что пользую Qt4. В принципе данный сигнал присутствует в Q3DockWindow, но хотелось бы знать, как сделать с помощью именно Qt4.


Название: прятание QToolBar
Отправлено: Телков Сергей от Июля 26, 2005, 08:33
Можешь использовать следующий подход.

На сигнал aboutToShow() твоего меню вешаешь слот. В этом слоте пробегаешь по всем пунктам меню, касающимся тулбаров и обновляешь их состояние (QPopupMenu::setItemChecked()) используя результат возвращаемый функцией тулбара isVisible() (лучше isVisibleTo( <главное_окно_приложения> ).

Можно меню очищать и заново добавлять в него все пункты меню с их статусами, основываясь на списке тулбаров (dock windows), взятому у главного окна (QMainWindow). Таким образом в меню всегда будет достоверная информация обо всех тулбарах, независимо от того когда они добавились/удалились/скрылись/показались. Если еще и список тулбаров фильтровать с использованием функции QMainWindow::isAppropriate(), то тогда меню будет похоже на контекстное меню.

Не знаю как в Qt 4, но в версиях 2 и 3 такой способ вполне применим. Для версии 3 я даже написал класс - наследник QAction, который выполняет такую работу, будучи добвленым в меню.


Название: прятание QToolBar
Отправлено: L.Marvell от Июля 26, 2005, 13:46
Цитата: "Телков Сергей"
Можешь использовать следующий подход.

На сигнал aboutToShow() твоего меню вешаешь слот. В этом слоте пробегаешь по всем пунктам меню, касающимся тулбаров и обновляешь их состояние (QPopupMenu::setItemChecked()) используя результат возвращаемый функцией тулбара isVisible() (лучше isVisibleTo( <главное_окно_приложения> ).

Можно меню очищать и заново добавлять в него все пункты меню с их статусами, основываясь на списке тулбаров (dock windows), взятому у главного окна (QMainWindow). Таким образом в меню всегда будет достоверная информация обо всех тулбарах, независимо от того когда они добавились/удалились/скрылись/показались. Если еще и список тулбаров фильтровать с использованием функции QMainWindow::isAppropriate(), то тогда меню будет похоже на контекстное меню.

Не знаю как в Qt 4, но в версиях 2 и 3 такой способ вполне применим. Для версии 3 я даже написал класс - наследник QAction, который выполняет такую работу, будучи добвленым в меню.

Огромное спасибо за мысль! Правда я уже сделал наследник класса Qtoolbar и на hideEvent() повесил setChecked(false). Может и геморно, но работает :)


Название: прятание QToolBar
Отправлено: Телков Сергей от Июля 26, 2005, 14:56
Цитата: "L.Marvell"

Огромное спасибо за мысль! Правда я уже сделал наследник класса Qtoolbar и на hideEvent() повесил setChecked(false). Может и геморно, но работает :)


Советую переопределить метод hide(), так как hideEvent() можно без особого ущерба недопустить с помощью eventFilter(). Впрочем если это использовано в рамках одного заранее известного приложения, то и так будет работать. А вот на библиотечный уровень такой подход все же не потянет по выше названой причине и так как нужно обязательно использовать переопределенный тулбар. Но это уже идеализация.


Название: прятание QToolBar
Отправлено: L.Marvell от Июля 26, 2005, 15:22
Цитата: "Телков Сергей"

Советую переопределить метод hide(), так как hideEvent() можно без особого ущерба недопустить с помощью eventFilter(). Впрочем если это использовано в рамках одного заранее известного приложения, то и так будет работать. А вот на библиотечный уровень такой подход все же не потянет по выше названой причине и так как нужно обязательно использовать переопределенный тулбар. Но это уже идеализация.

Вобщем-то да, это одно заранее известное приложение. Я пока просто учусь. Но за совет спасибо!