crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как получить текущий 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.

    QList <QTabBar *>lst = this->findChildren<QTabBar *>(); // рекурсивно ищем деток типа QTabBar* в QMainWindow
    quint8 i = 0; // 255 TabBar'ов должно хватить;)
    foreach(QTabBar *tab, lst)
    {
/*
QTabBar'ы могут создаваться, но не уничтожатся, поэтому они могут быть невидимы.
Еще есть вариант, когда в TabBar'e всего 2 DockWidget'а, при этом один плавает (floating),
пользователь видет, что TabBar исчез, однако реально исчезает только ярлычек.
QTabBar скрывается, когда плавающее окно пришвартовывается куда-нибудь и в QTabBare
остается всего 1 элемент. В общем проверка с count'ом опциональна, чтобы детектить
где QTabBar'ы имеют ярлычки.
*/
        if (tab->isVisible() /*&& tab->count() > 1*/)
        {
            i++; // ведем подсчет видимых QTabBar'ов, если надо
/*
Далее идет непереводимая игра слов :)
Разработчики Qt в каждый ярлычек помещают указатель на QDockWidget, которому ярлычек принадлежит.
Процедура перевода указателя QWidget'a в QVariant с пользовательским типом и обратно.
Страшный тип quintptr - кроссплатформенный вариант указателя, где надо его размер 32 бита, где не надо 64.
*/
            quintptr wId = qvariant_cast<quintptr>(tab->tabData(tab->currentIndex()));
            QDockWidget *widget = reinterpret_cast<QDockWidget *>(wId);
            QMessageBox::information(0,"Info", QString("class:%1, title:%2").arg(widget->metaObject()->className()).arg(widget->windowTitle()));
        }
    }


Логика кода следующая. Ищем все видимые QTabBar'ы и получаем указатель на QDockWidget, который в данный момент показывается пользователю (тоже самое что и QTabWidget::currentWidget()).



---
Я не помещаю решение в Вики из-за того, что оно по сути - хак (если администрация даст добро, то помещу) и хотелось бы услышать мнения людей, может быть от меня ускользнули очевидные вещи.

Сообщение отредактировал SABROG - 26.12.2008, 0:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 27.12.2008, 14:00
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(SABROG @ 27.12.2008, 16:35) *
Стоит в вики внести оба варианта, с reinterpret как дополнительный ?
если есть желание напиши в ЧаВо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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
- - SABROG   Цитата(kwisp @ 26.12.2008, 10:16) не помо...   26.12.2008, 12:12
|- - kwisp   Цитата(SABROG @ 26.12.2008, 12:12) Цитата...   26.12.2008, 13:48
- - 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


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 23:58