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