Здравствуйте, гость ( Вход | Регистрация )
|
SABROG |
26.12.2008, 0:01
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34
|
Сегодня озадачился таким вопросом. Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow. Т.е. это QDockWidget'ы положенные друг на друга таким образом, что появляются ярлычки как в QTabWidget. Но проблема в том, что это QTabBar и у него нет метода типа QTabWidget::currentWidget(). Более того, по сути эти QTabBar'ы не принадлежат нам и получить на них указатели стандартными средствами QMainWindow мы не можем. Также напрашивается решение - пробежаться по всем QDockWidget'ам и найти те, которые не спрятаны (isVisible). Со слов другого человека этот вариант не работает, т.к. у всех виджетов метод isVisible возвращает true. Также я предложил вариант проверить x,y,width,height. Если у двух виджетов они одинаковы, значит они лежат друг на друге, а следовательно в "стеке" (QMainWindow не использует ни один из вариантов стека виджетов или лэйаутов). Но оказалось, что у видимых QDockWidget'ов координаты положительные, в то время как у скрытых за ними виджетами они отрицательные. Т.е. этот способ можно использовать, но выглядит он не очень надежным. В итоге этот вопрос привел меня к следующему решению.
Сразу хочу предупредить, что этот вариант может не работать на других версиях Qt, т.к. в них может быть уже по другому реализован класс QMainWindow/QDockWidget. Логика кода следующая. Ищем все видимые QTabBar'ы и получаем указатель на QDockWidget, который в данный момент показывается пользователю (тоже самое что и QTabWidget::currentWidget()). ![]() --- Я не помещаю решение в Вики из-за того, что оно по сути - хак (если администрация даст добро, то помещу) и хотелось бы услышать мнения людей, может быть от меня ускользнули очевидные вещи. Сообщение отредактировал SABROG - 26.12.2008, 0:20 |
|
|
|
![]() |
|
SABROG |
26.12.2008, 12:12
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34
|
Цитата(kwisp @ 26.12.2008, 10:16) Link не поможет? Совершенно. QMainWindow использует QTabBar'ы, не QTabWidget'ы. А в QTabBar'е есть только currentIndex. Но опять же стандартными методами через QMainWindow невозможно получить список указателей на QTabBar'ы, если таковые существуют. А их может и не быть, если пользователь не манипулировал с доками. Цитата(Litkevich Yuriy @ 26.12.2008, 10:54) Link SABROG, вобщем, тему стоит пожевать и найти решение. Я думаю надо делать либо класс "организатор", либо наследника более умного от QDockWidget. Если делать умного наследника от QDockWidget'а, то что это должно дать ? Проверку типа isTopWidget() ? Класс организатор тоже решение. Хоть и правильное решение с точки зрения программирования, но достаточно непростое и скорее смахивает на затычку. По-хорошему надо написать и класс-менеджер и добавить в таск-лист троллям, что хотелось бы иметь подобную возможность. Т.е. добавить методы для QMainWindow и доп.класс типа QDockTabBar на базе QTabBar: QList <QDockTabBar *> QMainWindow::dockTabBars() const Для класса QDockTabBar метод: QDockWidget * QDockTabBar::currentWidget() const void QDockTabBar::setCurrentWidget(QDockWidget *dw) Может еще какие-то. |
|
|
|
|
kwisp |
26.12.2008, 13:48
Сообщение
#3
|
|
астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23
|
Цитата(SABROG @ 26.12.2008, 12:12) Link Цитата(kwisp @ 26.12.2008, 10:16) Link не поможет? Совершенно. QMainWindow использует QTabBar'ы, не QTabWidget'ы. А в QTabBar'е есть только currentIndex. Но опять же стандартными методами через QMainWindow невозможно получить список указателей на QTabBar'ы, если таковые существуют. А их может и не быть, если пользователь не манипулировал с доками. Цитата(Litkevich Yuriy @ 26.12.2008, 10:54) Link SABROG, вобщем, тему стоит пожевать и найти решение. Я думаю надо делать либо класс "организатор", либо наследника более умного от QDockWidget. Если делать умного наследника от QDockWidget'а, то что это должно дать ? Проверку типа isTopWidget() ? Класс организатор тоже решение. Хоть и правильное решение с точки зрения программирования, но достаточно непростое и скорее смахивает на затычку. По-хорошему надо написать и класс-менеджер и добавить в таск-лист троллям, что хотелось бы иметь подобную возможность. Т.е. добавить методы для QMainWindow и доп.класс типа QDockTabBar на базе QTabBar: QList <QDockTabBar *> QMainWindow::dockTabBars() const Для класса QDockTabBar метод: QDockWidget * QDockTabBar::currentWidget() const void QDockTabBar::setCurrentWidget(QDockWidget *dw) Может еще какие-то. прошу прощения в Qt 4.4.3. есть int QTabBar::currentIndex()const; void QTabBar::currentChanged(int);[signal] очепятка вышла. |
|
|
|
SABROG Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow 26.12.2008, 0:01
Litkevich Yuriy Цитата(SABROG @ 26.12.2008, 3:01) хочу пр... 26.12.2008, 0:18
SABROG Windows XP Professional SP3 (2002 build)
MinGW 3.4... 26.12.2008, 0:22
Litkevich Yuriy может я что-то не понял, но узнать видимый или нет... 26.12.2008, 0:40
SABROG Тоже вариант, правда неудобный. Придется создавать... 26.12.2008, 9:14
kwisp в Qt 4.4.3. есть
int QTabWidget::currentIndex()c... 26.12.2008, 10:16
Litkevich Yuriy SABROG, вобщем, тему стоит пожевать и найти решени... 26.12.2008, 10:54
Litkevich Yuriy SABROG, давай еще раз формулировку задачи.
Положим... 26.12.2008, 12:37
SABROG Предположим ситуацию. У пользователя есть доквидже... 26.12.2008, 13:15
Litkevich Yuriy в итоге: список видимых (или тех, что сверху) в да... 26.12.2008, 13:23
SABROG Я предлагаю не ограничиваться только этой задачей.... 26.12.2008, 13:34
SABROG Цитата(kwisp @ 26.12.2008, 13:48) прошу п... 26.12.2008, 14:03
SABROG В общем решил развить тему сигнала visibilityChang... 26.12.2008, 23:12
Litkevich Yuriy SABROG, чёто с форматированием, как-то все плохо
... 26.12.2008, 23:19
SABROG Цитата(Litkevich Yuriy @ 26.12.2008, 23:1... 26.12.2008, 23:23
Litkevich Yuriy Цитата(SABROG @ 27.12.2008, 2:23) Просто ... 27.12.2008, 0:51
SABROG Цитата(Litkevich Yuriy @ 27.12.2008, 0:51... 27.12.2008, 13:35
Litkevich Yuriy Цитата(SABROG @ 27.12.2008, 16:35) Стоит ... 27.12.2008, 14:00
Litkevich Yuriy из изменений в 4.5.0:
Цитата- QMainWindow
* ad... 4.3.2009, 5:50![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 23.12.2025, 17:46 |