📄 qdockarealayout.cpp
字号:
QWidgetAnimator *widgetAnimator = mainWindowLayout()->widgetAnimator;#ifndef QT_NO_TABBAR if (tabbed) { QRect tab_rect; QSize tbh = tabBarSizeHint(); if (tabBarVisible) { switch (tabBarShape) { case QTabBar::RoundedNorth: tab_rect = QRect(rect.left(), rect.top(), rect.width(), tbh.height()); break; case QTabBar::RoundedSouth: tab_rect = QRect(rect.left(), rect.bottom() - tbh.height() + 1, rect.width(), tbh.height()); break; case QTabBar::RoundedEast: tab_rect = QRect(rect.right() - tbh.width() + 1, rect.top(), tbh.width(), rect.height()); break; case QTabBar::RoundedWest: tab_rect = QRect(rect.left(), rect.top(), tbh.width(), rect.height()); break; default: break; } } widgetAnimator->animate(tabBar, tab_rect, animate); }#endif // QT_NO_TABBAR for (int i = 0; i < item_list.size(); ++i) { QDockAreaLayoutItem &item = item_list[i]; if (item.gap) continue; if (item.subinfo != 0) { item.subinfo->apply(animate); continue; } if (item.skip()) continue; Q_ASSERT(item.widgetItem); QRect r = itemRect(i); QWidget *w = item.widgetItem->widget(); QRect geo = w->geometry(); widgetAnimator->animate(w, r, animate); if (!w->isHidden()) { QDockWidget *dw = qobject_cast<QDockWidget*>(w); if (!r.isValid() && geo.right() >= 0 && geo.bottom() >= 0) { dw->lower(); emit dw->visibilityChanged(false); } else if (r.isValid() && (geo.right() < 0 || geo.bottom() < 0)) { emit dw->visibilityChanged(true); } } }}static void paintSep(QPainter *p, QWidget *w, const QRect &r, Qt::Orientation o, bool mouse_over){ QStyleOption opt(0); opt.state = QStyle::State_None; if (w->isEnabled()) opt.state |= QStyle::State_Enabled; if (o != Qt::Horizontal) opt.state |= QStyle::State_Horizontal; if (mouse_over) opt.state |= QStyle::State_MouseOver; opt.rect = r; opt.palette = w->palette(); w->style()->drawPrimitive(QStyle::PE_IndicatorDockWidgetResizeHandle, &opt, p, w);}QRegion QDockAreaLayoutInfo::separatorRegion() const{ QRegion result; if (isEmpty()) return result;#ifndef QT_NO_TABBAR if (tabbed) return result;#endif for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.skip()) continue; int next = this->next(i); if (item.subinfo) result |= item.subinfo->separatorRegion(); if (next == -1) break; result |= separatorRect(i); } return result;}void QDockAreaLayoutInfo::paintSeparators(QPainter *p, QWidget *widget, const QRegion &clip, const QPoint &mouse) const{ if (isEmpty()) return;#ifndef QT_NO_TABBAR if (tabbed) return;#endif for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.skip()) continue; int next = this->next(i); if (item.gap || next != -1 && item_list.at(next).gap) continue; if (item.subinfo) { if (clip.contains(item.subinfo->rect)) item.subinfo->paintSeparators(p, widget, clip, mouse); } if (next == -1) break; QRect r = separatorRect(i); if (clip.contains(r)) paintSep(p, widget, r, o, r.contains(mouse)); }}int QDockAreaLayoutInfo::next(int index) const{ for (int i = index + 1; i < item_list.size(); ++i) { if (!item_list.at(i).skip()) return i; } return -1;}int QDockAreaLayoutInfo::prev(int index) const{ for (int i = index - 1; i >= 0; --i) { if (!item_list.at(i).skip()) return i; } return -1;}void QDockAreaLayoutInfo::tab(int index, QLayoutItem *dockWidgetItem){#ifdef QT_NO_TABBAR Q_UNUSED(index); Q_UNUSED(dockWidgetItem);#else if (tabbed) { item_list.append(QDockAreaLayoutItem(dockWidgetItem)); updateTabBar(); setCurrentTab(dockWidgetItem->widget()); } else { QDockAreaLayoutInfo *new_info = new QDockAreaLayoutInfo(sep, dockPos, o, tabBarShape, mainWindow); item_list[index].subinfo = new_info; new_info->item_list.append(item_list.at(index).widgetItem); item_list[index].widgetItem = 0; new_info->item_list.append(dockWidgetItem); new_info->tabbed = true; new_info->updateTabBar(); new_info->setCurrentTab(dockWidgetItem->widget()); }#endif // QT_NO_TABBAR}void QDockAreaLayoutInfo::split(int index, Qt::Orientation orientation, QLayoutItem *dockWidgetItem){ if (orientation == o) { item_list.insert(index + 1, QDockAreaLayoutItem(dockWidgetItem)); } else {#ifdef QT_NO_TABBAR const int tabBarShape = 0;#endif QDockAreaLayoutInfo *new_info = new QDockAreaLayoutInfo(sep, dockPos, orientation, tabBarShape, mainWindow); item_list[index].subinfo = new_info; new_info->item_list.append(item_list.at(index).widgetItem); item_list[index].widgetItem = 0; new_info->item_list.append(dockWidgetItem); }}QDockAreaLayoutItem &QDockAreaLayoutInfo::item(QList<int> path){ Q_ASSERT(!path.isEmpty()); if (path.count() > 1) { QDockAreaLayoutItem &item = item_list[path.takeFirst()]; Q_ASSERT(item.subinfo != 0); return item.subinfo->item(path); } return item_list[path.first()];}QLayoutItem *QDockAreaLayoutInfo::itemAt(int *x, int index) const{ for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.subinfo) { if (QLayoutItem *ret = item.subinfo->itemAt(x, index)) return ret; } else if (item.widgetItem) { if ((*x)++ == index) return item.widgetItem; } } return 0;}QLayoutItem *QDockAreaLayoutInfo::takeAt(int *x, int index){ for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.subinfo) { if (QLayoutItem *ret = item.subinfo->takeAt(x, index)) { unnest(i); return ret; } } else if (item.widgetItem) { if ((*x)++ == index) { QLayoutItem *ret = item.widgetItem; item_list.removeAt(i); return ret; } } } return 0;}void QDockAreaLayoutInfo::deleteAllLayoutItems(){ for (int i = 0; i < item_list.count(); ++i) { QDockAreaLayoutItem &item= item_list[i]; if (item.subinfo) { item.subinfo->deleteAllLayoutItems(); } else { delete item.widgetItem; item.widgetItem = 0; } }}void QDockAreaLayoutInfo::saveState(QDataStream &stream) const{#ifndef QT_NO_TABBAR if (tabbed) { stream << (uchar) TabMarker; // write the index in item_list of the widget that's currently on top. quintptr id = currentTabId(); int index = -1; for (int i = 0; i < item_list.count(); ++i) { if (tabId(item_list.at(i)) == id) { index = i; break; } } stream << index; } else#endif // QT_NO_TABBAR { stream << (uchar) SequenceMarker; } stream << (uchar) o << item_list.count(); for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.widgetItem != 0) { stream << (uchar) WidgetMarker; QWidget *w = item.widgetItem->widget(); QString name = w->objectName(); if (name.isEmpty()) { qWarning("QMainWindow::saveState(): 'objectName' not set for QDockWidget %p '%s;", w, qPrintable(w->windowTitle())); } stream << name; uchar flags = 0; if (!w->isHidden()) flags |= StateFlagVisible; if (w->isWindow()) flags |= StateFlagFloating; stream << flags; if (w->isWindow()) { stream << w->x() << w->y() << w->width() << w->height(); } else { stream << item.pos << item.size << pick(o, item.minimumSize()) << pick(o, item.maximumSize()); } } else if (item.subinfo != 0) { stream << (uchar) SequenceMarker << item.pos << item.size << pick(o, item.minimumSize()) << pick(o, item.maximumSize()); item.subinfo->saveState(stream); } }}#ifdef Q_WS_MACstatic Qt::DockWidgetArea toDockWidgetArea(QInternal::DockPosition pos){ switch (pos) { case QInternal::LeftDock: return Qt::LeftDockWidgetArea; case QInternal::RightDock: return Qt::RightDockWidgetArea; case QInternal::TopDock: return Qt::TopDockWidgetArea; case QInternal::BottomDock: return Qt::BottomDockWidgetArea; default: break; } return Qt::NoDockWidgetArea;}#endifbool QDockAreaLayoutInfo::restoreState(QDataStream &stream, QList<QDockWidget*> &widgets){ uchar marker; stream >> marker; if (marker != TabMarker && marker != SequenceMarker) return false;#ifndef QT_NO_TABBAR tabbed = marker == TabMarker; int index = -1; if (tabbed) stream >> index;#endif uchar orientation; stream >> orientation; o = static_cast<Qt::Orientation>(orientation); int cnt; stream >> cnt; for (int i = 0; i < cnt; ++i) { uchar nextMarker; stream >> nextMarker; if (nextMarker == WidgetMarker) { QString name; uchar flags; stream >> name >> flags; if (name.isEmpty()) { int dummy; stream >> dummy >> dummy >> dummy >> dummy; continue; } QDockWidget *widget = 0; for (int j = 0; j < widgets.count(); ++j) { if (widgets.at(j)->objectName() == name) { widget = widgets.takeAt(j); break; } } if (widget == 0) { int dummy; stream >> dummy >> dummy >> dummy >> dummy; continue; } QDockAreaLayoutItem item(new QDockWidgetItem(widget)); if (flags & StateFlagFloating) { bool drawer = false;#ifdef Q_WS_MAC // drawer support extern bool qt_mac_is_macdrawer(const QWidget *); //qwidget_mac.cpp extern bool qt_mac_set_drawer_preferred_edge(QWidget *, Qt::DockWidgetArea); //qwidget_mac.cpp drawer = qt_mac_is_macdrawer(widget);#endif widget->hide(); if (!drawer) widget->setFloating(true); int x, y, w, h; stream >> x >> y >> w >> h;#ifdef Q_WS_MAC // drawer support if (drawer) { mainWindow->window()->createWinId(); widget->window()->createWinId(); qt_mac_set_drawer_preferred_edge(widget, toDockWidgetArea(dockPos)); } else#endif { widget->move(x, y); widget->resize(w, h); } widget->setVisible(flags & StateFlagVisible); } else { int dummy; stream >> item.pos >> item.size >> dummy >> dummy;// qDebug() << widget << item.pos << item.size; widget->setFloating(false); widget->setVisible(flags & StateFlagVisible); } item_list.append(item); } else if (nextMarker == SequenceMarker) { int dummy;#ifdef QT_NO_TABBAR const int tabBarShape = 0;#endif QDockAreaLayoutInfo *info = new QDockAreaLayoutInfo(sep, dockPos, o, tabBarShape, mainWindow); QDockAreaLayoutItem item(info); stream >> item.pos >> item.size >> dummy >> dummy; if (!info->restoreState(stream, widgets)) return false; item_list.append(item); } else { return false; } }#ifndef QT_NO_TABBAR if (tabbed && index >= 0 && index < item_list.count()) { updateTabBar(); setCurrentTabId(tabId(item_list.at(index))); }#endif return true;}#ifndef QT_NO_TABBARvoid QDockAreaLayoutInfo::updateTabBar() const{ if (!tabbed) return; QDockAreaLayoutInfo *that = const_cast<QDockAreaLayoutInfo*>(this); if (tabBar == 0) { that->tabBar = mainWindowLayout()->getTabBar(); that->tabBar->setShape(static_cast<QTabBar::Shape>(tabBarShape)); that->tabBar->setDrawBase(true); } bool blocked = tabBar->blockSignals(true); bool gap = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -