Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow |
Здравствуйте, гость ( Вход | Регистрация )
Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow |
Litkevich Yuriy |
26.12.2008, 13:23
Сообщение
#11
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
в итоге: список видимых (или тех, что сверху) в данный момент доквиджетов.
да, уместнее было бы чтобы это была функция QMainWindow, например: QList<QWidget*> QMainWindow::topDocWidgetsList() |
|
|
SABROG |
26.12.2008, 13:34
Сообщение
#12
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Я предлагаю не ограничиваться только этой задачей. Т.к. переключение табов, добавление, удаление виджета из/в таб/а програмным методом было бы тоже интересно. Правда я не пробывал, возможно ли сейчас сложить в табы выбранные доквиджеты програмным методом ? Это надо move() делать на заданные координаты или флаги какие устанавливать ?
|
|
|
kwisp |
26.12.2008, 13:48
Сообщение
#13
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
не поможет? Совершенно. QMainWindow использует QTabBar'ы, не QTabWidget'ы. А в QTabBar'е есть только currentIndex. Но опять же стандартными методами через QMainWindow невозможно получить список указателей на QTabBar'ы, если таковые существуют. А их может и не быть, если пользователь не манипулировал с доками. 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 |
26.12.2008, 14:03
Сообщение
#14
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
прошу прощения в Qt 4.4.3. есть int QTabBar::currentIndex()const; void QTabBar::currentChanged(int);[signal] очепятка вышла. Опять же. Ты не можешь стандартными методами QMainWindow получить указатели на QTabBar'ы. И полученные сигналы и индексы бесполезны, если нет возможности связать их с конкретными виджетами. |
|
|
SABROG |
26.12.2008, 23:12
Сообщение
#15
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
В общем решил развить тему сигнала visibilityChanged. На этот раз метод должен работать везде, т.к. привязки к нестандартным вещам нет
В конструкторе соединями сигналы каждого QDockWidget'а к одному слоту. Можно соединять вручную поименно каждый виджет, как удобнее. Просто с учетом на будущее я решил пробежаться по всем детишкам, мало ли добавится еще пара окон.
Наш слот. Хочу заметить, что он вызывается для каждого доквиджета при открытии главного окна с параметром true. Далее при перетаскивании любого доквиджета слот вызывается 4 раза. Сначала доквиджет скрывается (false), появляется плавающее окно (true), когда перетаскивание завершается, плавающий доквиджет скрывается (false), и вновь отображается уже в доке (true). При складывании доквиджетов в таббар приходят наши две пары сигналов плюс еще пара сигналов, всего 6 сигналов для одного виджета. Кроме этого приходит еще один сигнал с того виджета, который скрывается под перетащенным.
Логика следующая. Мы добавляем динамический параметр к каждому QDockWidget'у, который отображает его текущее состояние. В любой момент можно будет узнать какой доквиджет в данный момент не скрыт. По сути это аналог параметру visible у QWidget, но по неизвестным мне причинам он не работает. Отладочный вывод это показывает на последних строчках.
Пока я не затрагиваю тему управления QTabBar'ом. Как вам такой вариант решения ? Сообщение отредактировал SABROG - 26.12.2008, 23:28 |
|
|
Litkevich Yuriy |
26.12.2008, 23:19
Сообщение
#16
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
SABROG |
26.12.2008, 23:23
Сообщение
#17
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
SABROG, чёто с форматированием, как-то все плохо isVisible() этот метод имеет связь с методами show() и hide(), т.е. для определения виден ли пользователю определенно не подходитдля С++ кода надо использовать параметр в тэге код: [code=cpp][/code] С форматированием беда какая-то. При выборе cpp подсветка не отображается вообще. Если же пользовать "Код с подсветкой" вместо "Код", то код почему-то идентифицируется как perl, при том, что я указал cpp. Но даже в perl подсвечиваются только 2 слова. Еще текст весь поломался из-за того, что я не заметил закрытый тег код, который не открывал. Просто по логике, если окно исчезает, значит оно должно хайдиться чтоли Надо посмотреть как это организовано в QTabWidget. |
|
|
Litkevich Yuriy |
27.12.2008, 0:51
Сообщение
#18
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Просто по логике, если окно исчезает, значит оно должно хайдиться чтоли что значит исчезает?Если два доквиджета сложены вкладками и одному скомандывать hide(), то его вкладка исчезнет - виджет спрячится и isVisible() вернет "ложь" При выборе cpp подсветка не отображается вообще ну как видишь отображаетсяв первом блочке стандартных С++ных слов только два: this и bool |
|
|
SABROG |
27.12.2008, 13:35
Сообщение
#19
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
что значит исчезает? Если два доквиджета сложены вкладками и одному скомандывать hide(), то его вкладка исчезнет - виджет спрячится и isVisible() вернет "ложь" Я еще вчера посмотрел, в QTabWidget используется QStackedWidget, а он ничего не хайдит. В общем все понятно. ну как видишь отображается в первом блочке стандартных С++ных слов только два: this и bool Скудная подсветка просто, сразу не понял, другие хайлайтеры и скобочками со звездочками перекрашивают. А по теме есть что-нибудь ? Думаю менеджер классов делать бессмысленно, если есть динамические свойства. Стоит в вики внести оба варианта, с reinterpret как дополнительный ? |
|
|
Litkevich Yuriy |
27.12.2008, 14:00
Сообщение
#20
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Текстовая версия | Сейчас: 1.12.2024, 14:57 |