Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow |
Здравствуйте, гость ( Вход | Регистрация )
Как получить текущий QDockWidget, который отображается в QTabBar'e на MainWindow |
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, 23:12
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 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 |
|
|
Текстовая версия | Сейчас: 25.11.2024, 7:38 |