C++ (Qt) QMainWindow *win = qobject_cast<QMainWindow*>(parentWidget()); QMainWindowLayout *layout = 0; if (win != 0) layout = qobject_cast<QMainWindowLayout*>(win->layout());... case QEvent::ZOrderChange: { bool onTop = false; if (win != 0) { const QObjectList &siblings = win->children(); onTop = siblings.count() > 0 && siblings.last() == (QObject*)this; } if (!isFloating() && layout != 0 && onTop) layout->raise(this); break; }
C++ (Qt)if(dockWidget->y() < 0){...}
C++ (Qt) 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())); } }