📄 qdockarealayout.cpp
字号:
int tab_idx = 0; bool changed = false; for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.skip()) continue; if (item.gap) { gap = true; continue; } if (item.widgetItem == 0) continue; QDockWidget *dw = qobject_cast<QDockWidget*>(item.widgetItem->widget()); QString title = dw->d_func()->fixedWindowTitle; quintptr id = tabId(item); if (tab_idx == tabBar->count()) { tabBar->insertTab(tab_idx, title);#ifndef QT_NO_TOOLTIP tabBar->setTabToolTip(tab_idx, title);#endif tabBar->setTabData(tab_idx, id); changed = true; } else if (qvariant_cast<quintptr>(tabBar->tabData(tab_idx)) != id) { if (tab_idx + 1 < tabBar->count() && qvariant_cast<quintptr>(tabBar->tabText(tab_idx + 1)) == id) tabBar->removeTab(tab_idx); else { tabBar->insertTab(tab_idx, title);#ifndef QT_NO_TOOLTIP tabBar->setTabToolTip(tab_idx, title);#endif tabBar->setTabData(tab_idx, id); } changed = true; } if (title != tabBar->tabText(tab_idx)) { tabBar->setTabText(tab_idx, title);#ifndef QT_NO_TOOLTIP tabBar->setTabToolTip(tab_idx, title);#endif changed = true; } ++tab_idx; } while (tab_idx < tabBar->count()) { tabBar->removeTab(tab_idx); changed = true; } tabBar->blockSignals(blocked); that->tabBarVisible = gap || tabBar->count() > 1; if (changed || !tabBarMin.isValid() | !tabBarHint.isValid()) { that->tabBarMin = tabBar->minimumSizeHint(); that->tabBarHint = tabBar->sizeHint(); }}void QDockAreaLayoutInfo::setTabBarShape(int shape){ if (shape == tabBarShape) return; tabBarShape = shape; if (tabBar != 0) { tabBar->setShape(static_cast<QTabBar::Shape>(shape)); tabBarMin = QSize(); tabBarHint = QSize(); } for (int i = 0; i < item_list.count(); ++i) { QDockAreaLayoutItem &item = item_list[i]; if (item.subinfo != 0) item.subinfo->setTabBarShape(shape); }}QSize QDockAreaLayoutInfo::tabBarMinimumSize() const{ if (!tabbed) return QSize(0, 0); updateTabBar(); return tabBarMin;}QSize QDockAreaLayoutInfo::tabBarSizeHint() const{ if (!tabbed) return QSize(0, 0); updateTabBar(); return tabBarHint;}QSet<QTabBar*> QDockAreaLayoutInfo::usedTabBars() const{ QSet<QTabBar*> result; if (tabbed) { updateTabBar(); result.insert(tabBar); } for (int i = 0; i < item_list.count(); ++i) { const QDockAreaLayoutItem &item = item_list.at(i); if (item.subinfo != 0) result += item.subinfo->usedTabBars(); } return result;}QRect QDockAreaLayoutInfo::tabContentRect() const{ if (!tabbed) return QRect(); QRect result = rect; QSize tbh = tabBarSizeHint(); if (tabBarVisible) { switch (tabBarShape) { case QTabBar::RoundedNorth: result.adjust(0, tbh.height(), 0, 0); break; case QTabBar::RoundedSouth: result.adjust(0, 0, 0, -tbh.height()); break; case QTabBar::RoundedEast: result.adjust(0, 0, -tbh.width(), 0); break; case QTabBar::RoundedWest: result.adjust(tbh.width(), 0, 0, 0); break; default: break; } } return result;}#endif // QT_NO_TABBAR/******************************************************************************** QDockAreaLayout*/QDockAreaLayout::QDockAreaLayout(QMainWindow *win){ mainWindow = win; sep = win->style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent);#ifndef QT_NO_TABBAR const int tabShape = QTabBar::RoundedSouth;#else const int tabShape = 0;#endif docks[QInternal::LeftDock] = QDockAreaLayoutInfo(sep, QInternal::LeftDock, Qt::Vertical, tabShape, win); docks[QInternal::RightDock] = QDockAreaLayoutInfo(sep, QInternal::RightDock, Qt::Vertical, tabShape, win); docks[QInternal::TopDock] = QDockAreaLayoutInfo(sep, QInternal::TopDock, Qt::Horizontal, tabShape, win); docks[QInternal::BottomDock] = QDockAreaLayoutInfo(sep, QInternal::BottomDock, Qt::Horizontal, tabShape, win); centralWidgetItem = 0; centralWidgetRect = QRect(0, 0, -1, -1); corners[Qt::TopLeftCorner] = Qt::TopDockWidgetArea; corners[Qt::TopRightCorner] = Qt::TopDockWidgetArea; corners[Qt::BottomLeftCorner] = Qt::BottomDockWidgetArea; corners[Qt::BottomRightCorner] = Qt::BottomDockWidgetArea;}bool QDockAreaLayout::isValid() const{ return rect.isValid();}void QDockAreaLayout::saveState(QDataStream &stream) const{ stream << (uchar) DockWidgetStateMarker; int cnt = 0; for (int i = 0; i < QInternal::DockCount; ++i) { if (!docks[i].item_list.isEmpty()) ++cnt; } stream << cnt; for (int i = 0; i < QInternal::DockCount; ++i) { if (docks[i].item_list.isEmpty()) continue; stream << i << docks[i].rect.size(); docks[i].saveState(stream); } stream << centralWidgetRect.size(); for (int i = 0; i < 4; ++i) stream << static_cast<int>(corners[i]);}bool QDockAreaLayout::restoreState(QDataStream &stream, const QList<QDockWidget*> &_dockwidgets){ QList<QDockWidget*> dockwidgets = _dockwidgets; int cnt; stream >> cnt; for (int i = 0; i < cnt; ++i) { int pos; stream >> pos; QSize size; stream >> size; docks[pos].rect = QRect(QPoint(0, 0), size); if (!docks[pos].restoreState(stream, dockwidgets)) { stream.setStatus(QDataStream::ReadCorruptData); return false; } } QSize size; stream >> size; centralWidgetRect = QRect(QPoint(0, 0), size); bool ok = stream.status() == QDataStream::Ok; if (ok) { int cornerData[4]; for (int i = 0; i < 4; ++i) stream >> cornerData[i]; if (stream.status() == QDataStream::Ok) { for (int i = 0; i < 4; ++i) corners[i] = static_cast<Qt::DockWidgetArea>(cornerData[i]); } } return ok;}QList<int> QDockAreaLayout::indexOf(QWidget *dockWidget) const{ for (int i = 0; i < QInternal::DockCount; ++i) { QList<int> result = docks[i].indexOf(dockWidget); if (!result.isEmpty()) { result.prepend(i); return result; } } return QList<int>();}QList<int> QDockAreaLayout::gapIndex(const QPoint &pos) const{ QMainWindow::DockOptions opts = mainWindow->dockOptions(); bool nestingEnabled = opts & QMainWindow::AllowNestedDocks; QDockAreaLayoutInfo::TabMode tabMode = QDockAreaLayoutInfo::NoTabs;#ifndef QT_NO_TABBAR if (opts & QMainWindow::AllowTabbedDocks || opts & QMainWindow::VerticalTabs) tabMode = QDockAreaLayoutInfo::AllowTabs; if (opts & QMainWindow::ForceTabbedDocks) tabMode = QDockAreaLayoutInfo::ForceTabs; if (tabMode == QDockAreaLayoutInfo::ForceTabs) nestingEnabled = false;#endif for (int i = 0; i < QInternal::DockCount; ++i) { const QDockAreaLayoutInfo &info = docks[i]; if (!info.isEmpty() && info.rect.contains(pos)) { QList<int> result = docks[i].gapIndex(pos, nestingEnabled, tabMode); if (!result.isEmpty()) result.prepend(i); return result; } } for (int i = 0; i < QInternal::DockCount; ++i) { const QDockAreaLayoutInfo &info = docks[i]; if (info.isEmpty()) { QRect r; switch (i) { case QInternal::LeftDock: r = QRect(rect.left(), rect.top(), EmptyDropAreaSize, rect.height()); break; case QInternal::RightDock: r = QRect(rect.right() - EmptyDropAreaSize, rect.top(), EmptyDropAreaSize, rect.height()); break; case QInternal::TopDock: r = QRect(rect.left(), rect.top(), rect.width(), EmptyDropAreaSize); break; case QInternal::BottomDock: r = QRect(rect.left(), rect.bottom() - EmptyDropAreaSize, rect.width(), EmptyDropAreaSize); break; } if (r.contains(pos)) return QList<int>() << i << 0; } } return QList<int>();}QList<int> QDockAreaLayout::findSeparator(const QPoint &pos) const{ QList<int> result; for (int i = 0; i < QInternal::DockCount; ++i) { const QDockAreaLayoutInfo &info = docks[i]; if (info.isEmpty()) continue; if (separatorRect(i).contains(pos)) { result << i; break; } else if (info.rect.contains(pos)) { result = docks[i].findSeparator(pos); if (!result.isEmpty()) { result.prepend(i); break; } } } return result;}QDockAreaLayoutInfo *QDockAreaLayout::info(QWidget *widget){ for (int i = 0; i < QInternal::DockCount; ++i) { if (QDockAreaLayoutInfo *result = docks[i].info(widget)) return result; } return 0;}QDockAreaLayoutInfo *QDockAreaLayout::info(QList<int> path){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); if (path.isEmpty()) return &docks[index]; return docks[index].info(path);}const QDockAreaLayoutInfo *QDockAreaLayout::info(QList<int> path) const{ return const_cast<QDockAreaLayout*>(this)->info(path);}QDockAreaLayoutItem &QDockAreaLayout::item(QList<int> path){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); return docks[index].item(path);}QRect QDockAreaLayout::itemRect(QList<int> path) const{ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); return docks[index].itemRect(path);}QRect QDockAreaLayout::separatorRect(int index) const{ if (docks[index].isEmpty()) return QRect(); QRect r = docks[index].rect; switch (index) { case QInternal::LeftDock: return QRect(r.right() + 1, r.top(), sep, r.height()); case QInternal::RightDock: return QRect(r.left() - sep, r.top(), sep, r.height()); case QInternal::TopDock: return QRect(r.left(), r.bottom() + 1, r.width(), sep); case QInternal::BottomDock: return QRect(r.left(), r.top() - sep, r.width(), sep); default: break; } return QRect();}QRect QDockAreaLayout::separatorRect(QList<int> path) const{ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); if (path.isEmpty()) return separatorRect(index); else return docks[index].separatorRect(path);}bool QDockAreaLayout::insertGap(QList<int> path, QLayoutItem *dockWidgetItem){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); return docks[index].insertGap(path, dockWidgetItem);}QLayoutItem *QDockAreaLayout::plug(QList<int> path){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); return docks[index].plug(path);}QLayoutItem *QDockAreaLayout::unplug(QList<int> path){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); return docks[index].unplug(path);}void QDockAreaLayout::remove(QList<int> path){ Q_ASSERT(!path.isEmpty()); int index = path.takeFirst(); Q_ASSERT(index >= 0 && index < QInternal::DockCount); docks[index].remove(path);}static inline int qMin(int i1, int i2, int i3) { return qMin(i1, qMin(i2, i3)); }static inline int qMax(int i1, int i2, int i3) { return qMax(i1, qMax(i2, i3)); }void QDockAreaLayout::getGrid(QVector<QLayoutStruct> *_ver_struct_list, QVector<QLayoutStruct> *_hor_struct_list){ QSize center_hint(0, 0); QSize center_min(0, 0); bool have_central = centralWidgetItem != 0 && !centralWidgetItem->isEmpty(); if (have_central) { center_hint = centralWidgetRect.size(); if (!center_hint.isValid()) center_hint = centralWidgetItem->sizeHint(); center_min = centralWidgetItem->minimumSize(); } QRect center_rect = rect; if (!docks[QInternal:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -