📄 qmainwindowlayout.cpp
字号:
case Qt::RightDockWidgetArea: right.setBottom(r.bottom()); bottom.setRight(right.left() - 1); break; default: Q_ASSERT(false); } for (int i = 0; i < 4; ++i) { if (!layout_info[i].item) continue; if (rect[i].isValid()) layout_info[i].size = rect[i].size(); QRect x, s; switch (i) { case LEFT: x.setCoords(rect[i].left(), rect[i].top(), rect[i].right() - ext, rect[i].bottom()); s.setCoords(x.right() + 1, rect[i].top(), rect[i].right(), rect[i].bottom()); break; case RIGHT: x.setCoords(rect[i].left() + ext, rect[i].top(), rect[i].right(), rect[i].bottom()); s.setCoords(rect[i].left(), rect[i].top(), x.left() - 1, rect[i].bottom()); break; case TOP: x.setCoords(rect[i].left(), rect[i].top(), rect[i].right(), rect[i].bottom() - ext); s.setCoords(rect[i].left(), x.bottom() + 1, rect[i].right(), rect[i].bottom()); break; case BOTTOM: x.setCoords(rect[i].left(), rect[i].top() + ext, rect[i].right(), rect[i].bottom()); s.setCoords(rect[i].left(), rect[i].top(), rect[i].right(), x.top() - 1); break; default: Q_ASSERT(false); } if (relayout_type == QInternal::RelayoutNormal || layout_info[i].is_dummy) { QRect vr = QStyle::visualRect(QApplication::layoutDirection(), r, x); layout_info[i].item->setGeometry(vr); } if (relayout_type == QInternal::RelayoutNormal) { QRect vr = QStyle::visualRect(QApplication::layoutDirection(), r, s); layout_info[i].sep->setGeometry(vr); } } if (layout_info[CENTER].item) { QRect c; c.setCoords(left.right() + 1, top.bottom() + 1, right.left() - 1, bottom.top() - 1); layout_info[CENTER].size = c.size(); if (relayout_type == QInternal::RelayoutNormal) { QRect vr = QStyle::visualRect(QApplication::layoutDirection(), r, c); layout_info[CENTER].item->setGeometry(vr); } }}void QMainWindowLayout::addItem(QLayoutItem *){ qWarning("QMainWindowLayout: please use the public QMainWindow API instead."); }QSize QMainWindowLayout::sizeHint() const{ if (!szHint.isValid()) { int left = 0, right = 0, top = 0, bottom = 0;#ifndef QT_NO_TOOLBAR // layout toolbars for (int line = 0; line < tb_layout_info.size(); ++line) { const ToolBarLineInfo &lineInfo = tb_layout_info.at(line); QSize sz; // need to get the biggest size hint for all tool bars on each line for (int i = 0; i < lineInfo.list.size(); ++i) { const ToolBarLayoutInfo &info = lineInfo.list.at(i); QSize ms = info.item->sizeHint(); if (((lineInfo.pos == LEFT || lineInfo.pos == RIGHT) && (ms.width() > sz.width())) || (ms.height() > sz.height())) sz = ms; } switch (lineInfo.pos) { case LEFT: left += sz.width(); break; case RIGHT: right += sz.width(); break; case TOP: top += sz.height(); break; case BOTTOM: bottom += sz.height(); break; default: Q_ASSERT_X(false, "QMainWindowLayout", "internal error"); } }#endif // QT_NO_TOOLBAR const QSize szC = layout_info[CENTER].item ? layout_info[CENTER].item->sizeHint() : QSize(0, 0), szL = layout_info[LEFT].item ? layout_info[LEFT].item->sizeHint() : QSize(0, 0), szT = layout_info[TOP].item ? layout_info[TOP].item->sizeHint() : QSize(0, 0), szR = layout_info[RIGHT].item ? layout_info[RIGHT].item->sizeHint() : QSize(0, 0), szB = layout_info[BOTTOM].item ? layout_info[BOTTOM].item->sizeHint() : QSize(0, 0); int h1, h2, h3, w1, w2, w3; w1 = (corners[Qt::TopLeftCorner] == Qt::LeftDockWidgetArea ? szL.width() : 0) + szT.width() + (corners[Qt::TopRightCorner] == Qt::RightDockWidgetArea ? szR.width() : 0); w2 = szL.width() + szR.width() + szC.width(); w3 = (corners[Qt::BottomLeftCorner] == Qt::LeftDockWidgetArea ? szL.width() : 0) + szB.width() + (corners[Qt::BottomRightCorner] == Qt::RightDockWidgetArea ? szR.width(): 0); h1 = (corners[Qt::TopLeftCorner] == Qt::TopDockWidgetArea ? szT.height() : 0) + szL.height() + (corners[Qt::BottomLeftCorner] == Qt::BottomDockWidgetArea ? szB.height(): 0); h2 = szT.height() + szB.height() + szC.height(); h3 = (corners[Qt::TopRightCorner] == Qt::TopDockWidgetArea ? szT.height() : 0) + szR.height() + (corners[Qt::BottomRightCorner] == Qt::BottomDockWidgetArea ? szB.height() : 0); const int ext = parentWidget()->style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent); if (layout_info[LEFT].item && !szL.isEmpty()) left += ext; if (layout_info[RIGHT].item && !szR.isEmpty()) right += ext; if (layout_info[TOP].item && !szT.isEmpty()) top += ext; if (layout_info[BOTTOM].item && !szB.isEmpty()) bottom += ext; VDEBUG("QMainWindowLayout::sizeHint:\n" " %4dx%4d (l %4d r %4d t %4d b %4d w1 %4d w2 %4d w3 %4d, h1 %4d h2 %4d h3 %4d)", qMax(qMax(w1,w2),w3), qMax(qMax(h1,h2),h3), left, right, top, bottom, w1, w2, w3, h1, h2, h3); QSize szSB = statusbar ? statusbar->sizeHint() : QSize(0, 0); szHint = QSize(qMax(szSB.width(), qMax(qMax(w1,w2),w3) + left + right), szSB.height() + qMax(qMax(h1,h2),h3) + top + bottom); } return szHint;}QSize QMainWindowLayout::minimumSize() const{ if (!minSize.isValid()) { int left = 0, right = 0, top = 0, bottom = 0;#ifndef QT_NO_TOOLBAR // layout toolbars for (int line = 0; line < tb_layout_info.size(); ++line) { const ToolBarLineInfo &lineInfo = tb_layout_info.at(line); QSize sz; // need to get the biggest min size for all tool bars on each line for (int i = 0; i < lineInfo.list.size(); ++i) { const ToolBarLayoutInfo &info = lineInfo.list.at(i); QSize ms = info.item->minimumSize(); if (((lineInfo.pos == LEFT || lineInfo.pos == RIGHT) && (ms.width() > sz.width())) || (ms.height() > sz.height())) sz = ms; } switch (lineInfo.pos) { case LEFT: left += sz.width(); break; case RIGHT: right += sz.width(); break; case TOP: top += sz.height(); break; case BOTTOM: bottom += sz.height(); break; default: Q_ASSERT_X(false, "QMainWindowLayout", "internal error"); } }#endif // QT_NO_TOOLBAR const QSize szC = layout_info[CENTER].item ? layout_info[CENTER].item->minimumSize() : QSize(0, 0), szL = layout_info[LEFT].item ? layout_info[LEFT].item->minimumSize() : QSize(0, 0), szT = layout_info[TOP].item ? layout_info[TOP].item->minimumSize() : QSize(0, 0), szR = layout_info[RIGHT].item ? layout_info[RIGHT].item->minimumSize() : QSize(0, 0), szB = layout_info[BOTTOM].item ? layout_info[BOTTOM].item->minimumSize() : QSize(0, 0); int h1, h2, h3, w1, w2, w3; w1 = (corners[Qt::TopLeftCorner] == Qt::LeftDockWidgetArea ? szL.width() : 0) + szT.width() + (corners[Qt::TopRightCorner] == Qt::RightDockWidgetArea ? szR.width() : 0); w2 = szL.width() + szR.width() + szC.width(); w3 = (corners[Qt::BottomLeftCorner] == Qt::LeftDockWidgetArea ? szL.width() : 0) + szB.width() + (corners[Qt::BottomRightCorner] == Qt::RightDockWidgetArea ? szR.width() : 0); h1 = (corners[Qt::TopLeftCorner] == Qt::TopDockWidgetArea ? szT.height() : 0) + szL.height() + (corners[Qt::BottomLeftCorner] == Qt::BottomDockWidgetArea ? szB.height() : 0); h2 = szT.height() + szB.height() + szC.height(); h3 = (corners[Qt::TopRightCorner] == Qt::TopDockWidgetArea ? szT.height() : 0) + szR.height() + (corners[Qt::BottomRightCorner] == Qt::BottomDockWidgetArea ? szB.height() : 0); const int ext = parentWidget()->style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent); if (layout_info[LEFT].item && !szL.isEmpty()) left += ext; if (layout_info[RIGHT].item && !szR.isEmpty()) right += ext; if (layout_info[TOP].item && !szT.isEmpty()) top += ext; if (layout_info[BOTTOM].item && !szB.isEmpty()) bottom += ext; VDEBUG("QMainWindowLayout::minimumSize:\n" " %4dx%4d (l %4d r %4d t %4d b %4d w1 %4d w2 %4d w3 %4d, h1 %4d h2 %4d h3 %4d)", qMax(qMax(w1,w2),w3), qMax(qMax(h1,h2),h3), left, right, top, bottom, w1, w2, w3, h1, h2, h3); QSize szSB = statusbar ? statusbar->minimumSize() : QSize(0, 0); minSize = QSize(qMax(szSB.width(), qMax(qMax(w1,w2),w3) + left + right), szSB.height() + qMax(qMax(h1,h2),h3) + top + bottom); } return minSize;}void QMainWindowLayout::relayout(QInternal::RelayoutType type){ QRect g = geometry(); if (g.isValid()) { QInternal::RelayoutType save_type = relayout_type; relayout_type = type; setGeometry(g); relayout_type = save_type; } else { update(); }}void QMainWindowLayout::invalidate(){ if (relayout_type != QInternal::RelayoutDragging) { QLayout::invalidate(); minSize = szHint = QSize(); }}void QMainWindowLayout::saveLayoutInfo(){ Q_ASSERT(save_layout_info == 0); save_layout_info = new QVector<QMainWindowLayoutInfo>(layout_info); relayout_type = QInternal::RelayoutDragging;#ifndef QT_NO_DOCKWIDGET for (int i = 0; i < 4; ++i) { if (!layout_info[i].item) continue; QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout *>(layout_info[i].item->layout()); Q_ASSERT(layout != 0); layout->saveLayoutInfo(); }#endif}void QMainWindowLayout::resetLayoutInfo(){ Q_ASSERT(save_layout_info != 0); layout_info = *save_layout_info;#ifndef QT_NO_DOCKWIDGET for (int i = 0; i < 4; ++i) { if (!layout_info[i].item) continue; QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout *>(layout_info[i].item->layout()); Q_ASSERT(layout != 0); layout->resetLayoutInfo(); }#endif}void QMainWindowLayout::discardLayoutInfo(){ Q_ASSERT(save_layout_info != 0); delete save_layout_info; save_layout_info = 0; relayout_type = QInternal::RelayoutNormal;#ifndef QT_NO_DOCKWIDGET for (int i = 0; i < 4; ++i) { if (!layout_info[i].item) continue; QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout *>(layout_info[i].item->layout()); Q_ASSERT(layout != 0); layout->discardLayoutInfo(); }#endif}void QMainWindowLayout::beginConstrain(){#ifndef QT_NO_TOOLBAR save_tb_layout_info = new QList<ToolBarLineInfo>(tb_layout_info);#endif}void QMainWindowLayout:: endConstrain(){#ifndef QT_NO_TOOLBAR delete save_tb_layout_info; save_tb_layout_info = 0;#endif}#ifndef QT_NO_DOCKWIDGETint QMainWindowLayout::constrain(QDockWidgetLayout *dock, int delta){ QVector<QMainWindowLayoutInfo> info = save_layout_info ? *save_layout_info : layout_info; const POSITION order[] = { //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -