📄 qmdisubwindow.cpp
字号:
|| mainWindow->menuWidget()->isHidden()) return true; return isChildOfQMdiSubWindow(q);#endif#endif}#ifndef QT_NO_MENUBAR/*! \internal*/void QMdiSubWindowPrivate::showButtonsInMenuBar(QMenuBar *menuBar){ Q_Q(QMdiSubWindow); Q_ASSERT(q->isMaximized() && !drawTitleBarWhenMaximized()); removeButtonsFromMenuBar(); if (!controlContainer) controlContainer = new ControlContainer(q); ignoreWindowTitleChange = true; controlContainer->showButtonsInMenuBar(menuBar); ignoreWindowTitleChange = false; QWidget *topLevelWindow = q->window(); topLevelWindow->setWindowModified(q->isWindowModified()); topLevelWindow->installEventFilter(q); int buttonHeight = 0; if (controlContainer->controllerWidget()) buttonHeight = controlContainer->controllerWidget()->height(); else if (controlContainer->systemMenuLabel()) buttonHeight = controlContainer->systemMenuLabel()->height(); // This will rarely happen. if (menuBar && menuBar->height() < buttonHeight && topLevelWindow->layout()) { // Make sure topLevelWindow->contentsRect returns correct geometry. // topLevelWidget->updateGeoemtry will not do the trick here since it will post the event. QEvent event(QEvent::LayoutRequest); QApplication::sendEvent(topLevelWindow, &event); }}/*! \internal*/void QMdiSubWindowPrivate::removeButtonsFromMenuBar(){ if (!controlContainer) return; Q_Q(QMdiSubWindow); QMenuBar *currentMenuBar = 0;#ifndef QT_NO_MAINWINDOW if (QMainWindow *mainWindow = qobject_cast<QMainWindow *>(q->window())) { // NB! We can't use menuBar() here because that one will actually create // a menubar for us if not set. That's not what we want :-) currentMenuBar = qobject_cast<QMenuBar *>(mainWindow->menuWidget()); }#endif ignoreWindowTitleChange = true; controlContainer->removeButtonsFromMenuBar(currentMenuBar); ignoreWindowTitleChange = false; QWidget *topLevelWindow = q->window(); q->removeEventFilter(topLevelWindow); if (baseWidget && !drawTitleBarWhenMaximized()) topLevelWindow->setWindowModified(false);}#endif // QT_NO_MENUBARvoid QMdiSubWindowPrivate::updateWindowTitle(bool isRequestFromChild){ Q_Q(QMdiSubWindow); if (isRequestFromChild && !q->windowTitle().isEmpty() && !lastChildWindowTitle.isEmpty() && lastChildWindowTitle != q->windowTitle()) { return; } QWidget *titleWidget = 0; if (isRequestFromChild) titleWidget = baseWidget; else titleWidget = q; if (!titleWidget || titleWidget->windowTitle().isEmpty()) return; ignoreWindowTitleChange = true; q->setWindowTitle(titleWidget->windowTitle()); if (q->maximizedButtonsWidget()) setNewWindowTitle(q); ignoreWindowTitleChange = false;}#ifndef QT_NO_RUBBERBANDvoid QMdiSubWindowPrivate::enterRubberBandMode(){ Q_Q(QMdiSubWindow); if (q->isMaximized()) return; Q_ASSERT(oldGeometry.isValid()); Q_ASSERT(q->parent()); if (!rubberBand) rubberBand = new QRubberBand(QRubberBand::Rectangle, q->parentWidget()); QPoint rubberBandPos = q->mapToParent(QPoint(0, 0)); rubberBand->setGeometry(rubberBandPos.x(), rubberBandPos.y(), oldGeometry.width(), oldGeometry.height()); rubberBand->show(); isInRubberBandMode = true; q->grabMouse();}void QMdiSubWindowPrivate::leaveRubberBandMode(){ Q_Q(QMdiSubWindow); Q_ASSERT(rubberBand); Q_ASSERT(isInRubberBandMode); q->releaseMouse(); isInRubberBandMode = false; q->setGeometry(rubberBand->geometry()); rubberBand->hide(); currentOperation = None;}#endif // QT_NO_RUBBERBAND// Taken from the old QWorkspace (::readColors())QPalette QMdiSubWindowPrivate::desktopPalette() const{ Q_Q(const QMdiSubWindow); QPalette newPalette = q->palette(); bool colorsInitialized = false;#ifdef Q_WS_WIN // ask system properties on windows#ifndef SPI_GETGRADIENTCAPTIONS#define SPI_GETGRADIENTCAPTIONS 0x1008#endif#ifndef COLOR_GRADIENTACTIVECAPTION#define COLOR_GRADIENTACTIVECAPTION 27#endif#ifndef COLOR_GRADIENTINACTIVECAPTION#define COLOR_GRADIENTINACTIVECAPTION 28#endif if (QApplication::desktopSettingsAware()) { newPalette.setColor(QPalette::Active, QPalette::Highlight, colorref2qrgb(GetSysColor(COLOR_ACTIVECAPTION))); newPalette.setColor(QPalette::Inactive, QPalette::Highlight, colorref2qrgb(GetSysColor(COLOR_INACTIVECAPTION))); newPalette.setColor(QPalette::Active, QPalette::HighlightedText, colorref2qrgb(GetSysColor(COLOR_CAPTIONTEXT))); newPalette.setColor(QPalette::Inactive, QPalette::HighlightedText, colorref2qrgb(GetSysColor(COLOR_INACTIVECAPTIONTEXT))); if (QSysInfo::WindowsVersion != QSysInfo::WV_95 && QSysInfo::WindowsVersion != QSysInfo::WV_NT) { colorsInitialized = true; BOOL hasGradient; QT_WA({ SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &hasGradient, 0); } , { SystemParametersInfoA(SPI_GETGRADIENTCAPTIONS, 0, &hasGradient, 0); }); if (hasGradient) { newPalette.setColor(QPalette::Active, QPalette::Base, colorref2qrgb(GetSysColor(COLOR_GRADIENTACTIVECAPTION))); newPalette.setColor(QPalette::Inactive, QPalette::Base, colorref2qrgb(GetSysColor(COLOR_GRADIENTINACTIVECAPTION))); } else { newPalette.setColor(QPalette::Active, QPalette::Base, newPalette.color(QPalette::Active, QPalette::Highlight)); newPalette.setColor(QPalette::Inactive, QPalette::Base, newPalette.color(QPalette::Inactive, QPalette::Highlight)); } } }#endif // Q_WS_WIN if (!colorsInitialized) { newPalette.setColor(QPalette::Active, QPalette::Highlight, newPalette.color(QPalette::Active, QPalette::Highlight)); newPalette.setColor(QPalette::Active, QPalette::Base, newPalette.color(QPalette::Active, QPalette::Highlight)); newPalette.setColor(QPalette::Inactive, QPalette::Highlight, newPalette.color(QPalette::Inactive, QPalette::Dark)); newPalette.setColor(QPalette::Inactive, QPalette::Base, newPalette.color(QPalette::Inactive, QPalette::Dark)); newPalette.setColor(QPalette::Inactive, QPalette::HighlightedText, newPalette.color(QPalette::Inactive, QPalette::Window)); } return newPalette;}void QMdiSubWindowPrivate::updateActions(){ Qt::WindowFlags windowFlags = q_func()->windowFlags(); // Hide all for (int i = 0; i < NumWindowStateActions; ++i) setVisible(WindowStateAction(i), false); if (windowFlags & Qt::FramelessWindowHint) return; setVisible(StayOnTopAction, true); setVisible(MoveAction, moveEnabled); setVisible(ResizeAction, resizeEnabled); // CloseAction if (windowFlags & Qt::WindowSystemMenuHint) setVisible(CloseAction, true); // RestoreAction if (windowFlags & (Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint)) setVisible(RestoreAction, true); // MinimizeAction if (windowFlags & Qt::WindowMinimizeButtonHint) setVisible(MinimizeAction, true); // MaximizeAction if (windowFlags & Qt::WindowMaximizeButtonHint) setVisible(MaximizeAction, true);}void QMdiSubWindowPrivate::setFocusWidget(){ Q_Q(QMdiSubWindow); if (!baseWidget) { q->setFocus(); return; } // This will give focus to the next child if possible, otherwise // do nothing, hence it's not possible to tab between windows with // just hitting tab (unless Qt::TabFocus is removed from the focus policy). if (focusInReason == Qt::TabFocusReason) { q->focusNextChild(); return; } // Same as above, but gives focus to the previous child. if (focusInReason == Qt::BacktabFocusReason) { q->focusPreviousChild(); return; } if (QWidget *focusWidget = baseWidget->focusWidget()) { if (!focusWidget->hasFocus() && q->isAncestorOf(focusWidget) && focusWidget->isVisible() && !q->isMinimized() && focusWidget->focusPolicy() != Qt::NoFocus) { focusWidget->setFocus(); } else { q->setFocus(); } return; } QWidget *focusWidget = q->nextInFocusChain(); while (focusWidget && focusWidget != q && focusWidget->focusPolicy() == Qt::NoFocus) focusWidget = focusWidget->nextInFocusChain(); if (focusWidget && q->isAncestorOf(focusWidget)) focusWidget->setFocus(); else if (baseWidget->focusPolicy() != Qt::NoFocus) baseWidget->setFocus(); else if (!q->hasFocus()) q->setFocus();}void QMdiSubWindowPrivate::restoreFocus(){ if (!restoreFocusWidget) return; if (!restoreFocusWidget->hasFocus() && q_func()->isAncestorOf(restoreFocusWidget) && restoreFocusWidget->isVisible() && restoreFocusWidget->focusPolicy() != Qt::NoFocus) { restoreFocusWidget->setFocus(); } restoreFocusWidget = 0;}/*! \internal ### Please add QEvent::WindowFlagsChange event*/void QMdiSubWindowPrivate::setWindowFlags(Qt::WindowFlags windowFlags){ Q_Q(QMdiSubWindow); if (!q->parent()) { q->setWindowFlags(windowFlags); return; } Qt::WindowFlags windowType = windowFlags & Qt::WindowType_Mask; if (windowType == Qt::Dialog || windowFlags & Qt::MSWindowsFixedSizeDialogHint) windowFlags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint; // Set standard flags if none of the customize flags are set if (!(windowFlags & CustomizeWindowFlags)) windowFlags |= Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint; else if (windowFlags & Qt::FramelessWindowHint && windowFlags & Qt::WindowStaysOnTopHint) windowFlags = Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint; else if (windowFlags & Qt::FramelessWindowHint) windowFlags = Qt::FramelessWindowHint; windowFlags &= ~windowType; windowFlags |= Qt::SubWindow;#ifndef QT_NO_ACTION if (QAction *stayOnTopAction = actions[QMdiSubWindowPrivate::StayOnTopAction]) { if (windowFlags & Qt::WindowStaysOnTopHint) stayOnTopAction->setChecked(true); else stayOnTopAction->setChecked(false); }#endif#ifndef QT_NO_SIZEGRIP if ((windowFlags & Qt::FramelessWindowHint) && sizeGrip) delete sizeGrip;#endif q->setWindowFlags(windowFlags); updateGeometryConstraints(); updateActions(); QSize currentSize = q->size(); if (q->isVisible() && (currentSize.width() < internalMinimumSize.width() || currentSize.height() < internalMinimumSize.height())) { q->resize(currentSize.expandedTo(internalMinimumSize)); }}void QMdiSubWindowPrivate::setVisible(WindowStateAction action, bool visible){#ifndef QT_NO_ACTION if (actions[action]) actions[action]->setVisible(visible);#endif Q_Q(QMdiSubWindow); if (!controlContainer) controlContainer = new ControlContainer(q); if (ControllerWidget *ctrlWidget = qobject_cast<ControllerWidget *> (controlContainer->controllerWidget())) { ctrlWidget->setControlVisible(action, visible); }}#ifndef QT_NO_ACTIONvoid QMdiSubWindowPrivate::setEnabled(WindowStateAction action, bool enable){ if (actions[action]) actions[action]->setEnabled(enable);}#ifndef QT_NO_MENUvoid QMdiSubWindowPrivate::addToSystemMenu(WindowStateAction action, const QString &text, const char *slot){ if (!systemMenu) return; actions[action] = systemMenu->addAction(text, q_func(), slot);}#endif#endif // QT_NO_ACTION/*! \internal*/QSize QMdiSubWindowPrivate::iconSize() const{ Q_Q(const QMdiSubWindow); if (!q->parent() || q->windowFlags() & Qt::FramelessWindowHint) return QSize(-1, -1); return QSize(q->style()->pixelMetric(QStyle::PM_MdiSubWindowMinimizedWidth), titleBarHeight());}#ifndef QT_NO_SIZEGRIP/*! \internal*/void QMdiSubWindowPrivate::setSizeGrip(QSizeGrip *newSizeGrip){ Q_Q(QMdiSubWindow); if (!newSizeGrip || sizeGrip || q->windowFlags() & Qt::FramelessWindowHint) return; if (q->layout() && q->layout()->indexOf(newSizeGrip) != -1) return; newSizeGrip->setFixedSize(newSizeGrip->sizeHint()); bool putSizeGripInLayout = q->layout() ? true : false;#if defined(Q_WS_MAC) && !defined(QT_NO_STYLE_MAC) if (qobject_cast<QMacStyle *>(q->style())) putSizeGripInLayout = false;#endif if (putSizeGripInLayout) { q->layout()->addWidget(newSizeGrip); q->layout()->setAlignment(newSizeGrip, Qt::AlignBottom | Qt::AlignRight); } else { newSizeGrip->setParent(q); newSizeGrip->move(q->isLeftToRight() ? q->width() - newSizeGrip->width() : 0, q->height() - newSizeGrip->height()); sizeGrip = newSizeGrip; } newSizeGrip->raise(); updateGeometryConstraints(); newSizeGrip->installEventFilter(q);}/*!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -