📄 qmdisubwindow.cpp
字号:
if (QMainWindow *mainWindow = qobject_cast<QMainWindow *>(q->window())) {#ifdef QT_NO_MENUBAR Q_UNUSED(mainWindow);#else showButtonsInMenuBar(mainWindow->menuBar());#endif } else#endif // QT_NO_MAINWINDOW if (!controlContainer) { controlContainer = new ControlContainer(q); } } QWidget *parent = q->parentWidget(); QRect availableRect = parent->contentsRect(); // Adjust geometry if the sub-window is inside a scroll area. QAbstractScrollArea *scrollArea = qobject_cast<QAbstractScrollArea *>(parent->parentWidget()); if (scrollArea && scrollArea->viewport() == parent) { QScrollBar *hbar = scrollArea->horizontalScrollBar(); QScrollBar *vbar = scrollArea->verticalScrollBar(); const int xOffset = hbar ? hbar->value() : 0; const int yOffset = vbar ? vbar->value() : 0; availableRect.adjust(-xOffset, -yOffset, -xOffset, -yOffset); oldGeometry.adjust(xOffset, yOffset, xOffset, yOffset); } setNewGeometry(&availableRect); // QWidget::setGeometry will reset Qt::WindowMaximized so we have to update it here. ensureWindowState(Qt::WindowMaximized); if (wasVisible) q->setVisible(true); resizeEnabled = false; moveEnabled = false;#ifndef QT_NO_ACTION setEnabled(MoveAction, moveEnabled); setEnabled(MaximizeAction, false); setEnabled(MinimizeAction, true); setEnabled(RestoreAction, true); setEnabled(ResizeAction, resizeEnabled);#endif // QT_NO_ACTION Q_ASSERT(q->windowState() & Qt::WindowMaximized); Q_ASSERT(!(q->windowState() & Qt::WindowMinimized)); restoreFocus(); updateMask();}/*! \internal*/void QMdiSubWindowPrivate::setActive(bool activate){ Q_Q(QMdiSubWindow); if (!q->parent() || !activationEnabled) return; if (activate && !isActive && q->isEnabled()) { isActive = true; isExplicitlyDeactivated = false; Qt::WindowStates oldWindowState = q->windowState(); ensureWindowState(Qt::WindowActive); emit q->aboutToActivate(); if (q->isMaximized() && !drawTitleBarWhenMaximized()) {#ifndef QT_NO_MAINWINDOW if (QMainWindow *mainWindow = qobject_cast<QMainWindow *>(q->window())) {#ifdef QT_NO_MENUBAR Q_UNUSED(mainWindow);#else showButtonsInMenuBar(mainWindow->menuBar());#endif }#endif // QT_NO_MAINWINDOW } Q_ASSERT(isActive); emit q->windowStateChanged(oldWindowState, q->windowState()); } else if (!activate && isActive) { isActive = false; Qt::WindowStates oldWindowState = q->windowState(); q->overrideWindowState(q->windowState() & ~Qt::WindowActive); QWidget *focusWidget = QApplication::focusWidget(); if (focusWidget && (focusWidget == q || q->isAncestorOf(focusWidget))) focusWidget->clearFocus(); if (baseWidget) baseWidget->overrideWindowState(baseWidget->windowState() & ~Qt::WindowActive); Q_ASSERT(!isActive); emit q->windowStateChanged(oldWindowState, q->windowState()); } if (activate && isActive && q->isEnabled() && !q->hasFocus() && !q->isAncestorOf(QApplication::focusWidget())) { setFocusWidget(); ensureWindowState(Qt::WindowActive); } int frameWidth = q->style()->pixelMetric(QStyle::PM_MdiSubWindowFrameWidth); int titleBarHeight = this->titleBarHeight(); QRegion windowDecoration = QRegion(0, 0, q->width(), q->height()); windowDecoration -= QRegion(frameWidth, titleBarHeight, q->width() - 2 * frameWidth, q->height() - titleBarHeight - frameWidth); // Make sure we don't use cached style options if we get // resize events right before activation/deactivation. if (resizeTimerId != -1) { q->killTimer(resizeTimerId); resizeTimerId = -1; updateDirtyRegions(); } q->update(windowDecoration);}/*! \internal*/void QMdiSubWindowPrivate::processClickedSubControl(){ Q_Q(QMdiSubWindow); switch (activeSubControl) { case QStyle::SC_TitleBarContextHelpButton:#ifndef QT_NO_WHATSTHIS QWhatsThis::enterWhatsThisMode();#endif break; case QStyle::SC_TitleBarShadeButton: q->showShaded(); hoveredSubControl = QStyle::SC_TitleBarUnshadeButton; break; case QStyle::SC_TitleBarUnshadeButton: if (q->isShaded()) hoveredSubControl = QStyle::SC_TitleBarShadeButton; q->showNormal(); break; case QStyle::SC_TitleBarMinButton:#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) if (qobject_cast<QMacStyle *>(q->style())) { if (q->isMinimized()) q->showNormal(); else q->showMinimized(); break; }#endif q->showMinimized(); break; case QStyle::SC_TitleBarNormalButton: if (q->isShaded()) hoveredSubControl = QStyle::SC_TitleBarMinButton; q->showNormal(); break; case QStyle::SC_TitleBarMaxButton:#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) if (qobject_cast<QMacStyle *>(q->style())) { if (q->isMaximized()) q->showNormal(); else q->showMaximized(); break; }#endif q->showMaximized(); break; case QStyle::SC_TitleBarCloseButton: q->close(); break; default: break; }}/*! \internal*/QRegion QMdiSubWindowPrivate::getRegion(Operation operation) const{ Q_Q(const QMdiSubWindow); int width = q->width(); int height = q->height(); int titleBarHeight = this->titleBarHeight(); int frameWidth = q->style()->pixelMetric(QStyle::PM_MdiSubWindowFrameWidth); int cornerConst = titleBarHeight - frameWidth; int titleBarConst = 2 * titleBarHeight; if (operation == Move) { QStyleOptionTitleBar titleBarOptions = this->titleBarOptions(); QRegion move(frameWidth, frameWidth, width - 2 * frameWidth, cornerConst); // Depending on which window flags are set, activated sub controllers will // be subtracted from the 'move' region. for (int i = 0; i < NumSubControls; ++i) { if (SubControls[i] == QStyle::SC_TitleBarLabel) continue; move -= QRegion(q->style()->subControlRect(QStyle::CC_TitleBar, &titleBarOptions, SubControls[i])); } return move; } QRegion region;#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) if (qobject_cast<QMacStyle *>(q->style())) return region;#endif switch (operation) { case TopResize: region = QRegion(titleBarHeight, 0, width - titleBarConst, frameWidth); break; case BottomResize: region = QRegion(titleBarHeight, height - frameWidth, width - titleBarConst, frameWidth); break; case LeftResize: region = QRegion(0, titleBarHeight, frameWidth, height - titleBarConst); break; case RightResize: region = QRegion(width - frameWidth, titleBarHeight, frameWidth, height - titleBarConst); break; case TopLeftResize: region = QRegion(0, 0, titleBarHeight, titleBarHeight) - QRegion(frameWidth, frameWidth, cornerConst, cornerConst); break; case TopRightResize: region = QRegion(width - titleBarHeight, 0, titleBarHeight, titleBarHeight) - QRegion(width - titleBarHeight, frameWidth, cornerConst, cornerConst); break; case BottomLeftResize: region = QRegion(0, height - titleBarHeight, titleBarHeight, titleBarHeight) - QRegion(frameWidth, height - titleBarHeight, cornerConst, cornerConst); break; case BottomRightResize: region = QRegion(width - titleBarHeight, height - titleBarHeight, titleBarHeight, titleBarHeight) - QRegion(width - titleBarHeight, height - titleBarHeight, cornerConst, cornerConst); break; default: break; } return region;}/*! \internal*/QMdiSubWindowPrivate::Operation QMdiSubWindowPrivate::getOperation(const QPoint &pos) const{ OperationInfoMap::const_iterator it; for (it = operationMap.constBegin(); it != operationMap.constEnd(); ++it) if (it.value().region.contains(pos)) return it.key(); return None;}extern QString qt_setWindowTitle_helperHelper(const QString &, QWidget *);/*! \internal*/QStyleOptionTitleBar QMdiSubWindowPrivate::titleBarOptions() const{ Q_Q(const QMdiSubWindow); QStyleOptionTitleBar titleBarOptions; titleBarOptions.initFrom(q); if (activeSubControl != QStyle::SC_None) { if (hoveredSubControl == activeSubControl) { titleBarOptions.state |= QStyle::State_Sunken; titleBarOptions.activeSubControls = activeSubControl; } } else if (autoRaise() && hoveredSubControl != QStyle::SC_None && hoveredSubControl != QStyle::SC_TitleBarLabel) { titleBarOptions.state |= QStyle::State_MouseOver; titleBarOptions.activeSubControls = hoveredSubControl; } else { titleBarOptions.state &= ~QStyle::State_MouseOver; titleBarOptions.activeSubControls = QStyle::SC_None; } titleBarOptions.subControls = QStyle::SC_All; titleBarOptions.titleBarFlags = q->windowFlags(); titleBarOptions.titleBarState = q->windowState(); titleBarOptions.palette = titleBarPalette; titleBarOptions.icon = menuIcon; if (isActive) { titleBarOptions.state |= QStyle::State_Active; titleBarOptions.titleBarState |= QStyle::State_Active; titleBarOptions.palette.setCurrentColorGroup(QPalette::Active); } else { titleBarOptions.state &= ~QStyle::State_Active; titleBarOptions.palette.setCurrentColorGroup(QPalette::Inactive); } int border = hasBorder(titleBarOptions) ? 4 : 0; int paintHeight = titleBarHeight(titleBarOptions); paintHeight -= q->isMinimized() ? 2 * border : border; titleBarOptions.rect = QRect(border, border, q->width() - 2 * border, paintHeight); if (!windowTitle.isEmpty()) { // Set the text here before asking for the width of the title bar label // in case people uses the actual text to calculate the width. titleBarOptions.text = windowTitle; titleBarOptions.fontMetrics = QFontMetrics(font); int width = q->style()->subControlRect(QStyle::CC_TitleBar, &titleBarOptions, QStyle::SC_TitleBarLabel, q).width(); // Set elided text if we don't have enough space for the entire title. titleBarOptions.text = titleBarOptions.fontMetrics.elidedText(windowTitle, Qt::ElideRight, width); } return titleBarOptions;}/*! \internal*/void QMdiSubWindowPrivate::ensureWindowState(Qt::WindowState state){ Q_Q(QMdiSubWindow); Qt::WindowStates windowStates = q->windowState() | state; switch (state) { case Qt::WindowMinimized: windowStates &= ~Qt::WindowMaximized; windowStates &= ~Qt::WindowNoState; break; case Qt::WindowMaximized: windowStates &= ~Qt::WindowMinimized; windowStates &= ~Qt::WindowNoState; break; case Qt::WindowNoState: windowStates &= ~Qt::WindowMinimized; windowStates &= ~Qt::WindowMaximized; break; default: break; } if (baseWidget) { if (!(baseWidget->windowState() & Qt::WindowActive) && windowStates & Qt::WindowActive) baseWidget->overrideWindowState(windowStates & ~Qt::WindowActive); else baseWidget->overrideWindowState(windowStates); } q->overrideWindowState(windowStates);}/*! \internal*/int QMdiSubWindowPrivate::titleBarHeight(const QStyleOptionTitleBar &options) const{ Q_Q(const QMdiSubWindow); if (!q->parent() || q->windowFlags() & Qt::FramelessWindowHint || (q->isMaximized() && !drawTitleBarWhenMaximized())) { return 0; } int height = q->style()->pixelMetric(QStyle::PM_TitleBarHeight, &options);#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) // ### Fix mac style, the +4 pixels hack is not necessary anymore if (qobject_cast<QMacStyle *>(q->style())) height -= 4;#endif if (hasBorder(options)) height += q->isMinimized() ? 8 : 4; return height;}/*! \internal*/void QMdiSubWindowPrivate::sizeParameters(int *margin, int *minWidth) const{ Q_Q(const QMdiSubWindow); Qt::WindowFlags flags = q->windowFlags(); if (!q->parent() || flags & Qt::FramelessWindowHint) { *margin = 0; *minWidth = 0; return; } if (q->isMaximized() && !drawTitleBarWhenMaximized()) *margin = 0; else *margin = q->style()->pixelMetric(QStyle::PM_MdiSubWindowFrameWidth); QStyleOptionTitleBar opt = this->titleBarOptions(); int tempWidth = 0; for (int i = 0; i < NumSubControls; ++i) { if (SubControls[i] == QStyle::SC_TitleBarLabel) { tempWidth += 30; continue; } QRect rect = q->style()->subControlRect(QStyle::CC_TitleBar, &opt, SubControls[i], q); if (!rect.isValid()) continue; tempWidth += rect.width(); } *minWidth = tempWidth;}/*! \internal*/bool QMdiSubWindowPrivate::drawTitleBarWhenMaximized() const{ Q_Q(const QMdiSubWindow); if (q->window()->testAttribute(Qt::WA_CanHostQMdiSubWindowTitleBar)) return false;#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) return true;#else if (q->style()->styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, 0, q)) return true;#if defined(QT_NO_MENUBAR) || defined(QT_NO_MAINWINDOW) return true;#else QMainWindow *mainWindow = qobject_cast<QMainWindow *>(q->window()); if (!mainWindow || !qobject_cast<QMenuBar *>(mainWindow->menuWidget())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -