📄 qworkspace.cpp
字号:
bool QWorkspace::eventFilter(QObject *o, QEvent * e){ Q_D(QWorkspace); static QTime* t = 0; static QWorkspace* tc = 0; if (o == d->maxtools) { switch (e->type()) { case QEvent::MouseButtonPress: { QMenuBar* b = (QMenuBar*)o->parent(); if (!t) t = new QTime; if (tc != this || t->elapsed() > QApplication::doubleClickInterval()) { if (isRightToLeft()) { QPoint p = b->mapToGlobal(QPoint(b->x() + b->width(), b->y() + b->height())); p.rx() -= d->popup->sizeHint().width(); d->_q_popupOperationMenu(p); } else { d->_q_popupOperationMenu(b->mapToGlobal(QPoint(b->x(), b->y() + b->height()))); } t->start(); tc = this; } else { tc = 0; closeActiveWindow(); } return true; } default: break; } return QWidget::eventFilter(o, e); } switch (e->type()) { case QEvent::HideToParent: break; case QEvent::ShowToParent: if (QWorkspaceChild *c = qobject_cast<QWorkspaceChild*>(o)) if (!d->focus.contains(c)) d->focus.append(c); d->updateWorkspace(); break; case QEvent::WindowTitleChange: if (!d->inTitleChange) { if (o == window()) d->topTitle = window()->windowTitle(); if (d->maxWindow && d->maxWindow->windowWidget() && d->topTitle.size()) { d->inTitleChange = true; window()->setWindowTitle(tr("%1 - [%2]") .arg(d->topTitle).arg(d->maxWindow->windowWidget()->windowTitle())); d->inTitleChange = false; } } break; case QEvent::ModifiedChange: if (o == d->maxWindow) window()->setWindowModified(d->maxWindow->isWindowModified()); break; case QEvent::Close: if (o == window()) { QList<QWorkspaceChild *>::Iterator it(d->windows.begin()); while (it != d->windows.end()) { QWorkspaceChild* c = *it; ++it; if (c->shademode) c->showShaded(); } } else if (qobject_cast<QWorkspaceChild*>(o)) { d->popup->hide(); } d->updateWorkspace(); break; default: break; } return QWidget::eventFilter(o, e);}static QMenuBar *findMenuBar(QWidget *w){ // don't search recursively to avoid finding a menubar of a // mainwindow that happens to be a workspace window (like // a mainwindow in designer) QList<QObject *> children = w->children(); for (int i = 0; i < children.count(); ++i) { QMenuBar *bar = qobject_cast<QMenuBar *>(children.at(i)); if (bar) return bar; } return 0;}void QWorkspacePrivate::showMaximizeControls(){ Q_Q(QWorkspace); Q_ASSERT(maxWindow); // merge windowtitle and modified state if (!topTitle.size()) topTitle = q->window()->windowTitle(); if (maxWindow->windowWidget()) { QString docTitle = maxWindow->windowWidget()->windowTitle(); if (topTitle.size() && docTitle.size()) { inTitleChange = true; q->window()->setWindowTitle(QWorkspace::tr("%1 - [%2]").arg(topTitle).arg(docTitle)); inTitleChange = false; } q->window()->setWindowModified(maxWindow->windowWidget()->isWindowModified()); } if (!q->style()->styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, 0, q)) { QMenuBar* b = 0; // Do a breadth-first search first on every parent, QWidget* w = q->parentWidget(); while (w) { b = findMenuBar(w); if (b) break; w = w->parentWidget(); } // last attempt. if (!b) b = findMenuBar(q->window()); if (!b) return; if (!maxcontrols) { maxmenubar = b; maxcontrols = new QFrame(q->window()); maxcontrols->setObjectName(QLatin1String("qt_maxcontrols")); QHBoxLayout* l = new QHBoxLayout(maxcontrols); l->setMargin(maxcontrols->frameWidth()); l->setSpacing(0); if (maxWindow->windowWidget() && (maxWindow->windowWidget()->windowFlags() & Qt::WindowMinimizeButtonHint)) { QToolButton* iconB = new QToolButton(maxcontrols); iconB->setObjectName(QLatin1String("iconify"));#ifndef QT_NO_TOOLTIP iconB->setToolTip(QWorkspace::tr("Minimize"));#endif l->addWidget(iconB); iconB->setFocusPolicy(Qt::NoFocus); QPixmap pm = q->style()->standardPixmap(QStyle::SP_TitleBarMinButton); iconB->setIcon(pm); iconB->setIconSize(pm.size()); QObject::connect(iconB, SIGNAL(clicked()), q, SLOT(_q_minimizeActiveWindow())); } QToolButton* restoreB = new QToolButton(maxcontrols); restoreB->setObjectName(QLatin1String("restore"));#ifndef QT_NO_TOOLTIP restoreB->setToolTip(QWorkspace::tr("Restore Down"));#endif l->addWidget(restoreB); restoreB->setFocusPolicy(Qt::NoFocus); QPixmap pm = q->style()->standardPixmap(QStyle::SP_TitleBarNormalButton); restoreB->setIcon(pm); restoreB->setIconSize(pm.size()); QObject::connect(restoreB, SIGNAL(clicked()), q, SLOT(_q_normalizeActiveWindow())); l->addSpacing(2); QToolButton* closeB = new QToolButton(maxcontrols); closeB->setObjectName(QLatin1String("close"));#ifndef QT_NO_TOOLTIP closeB->setToolTip(QWorkspace::tr("Close"));#endif l->addWidget(closeB); closeB->setFocusPolicy(Qt::NoFocus); pm = q->style()->standardPixmap(QStyle::SP_TitleBarCloseButton); closeB->setIcon(pm); closeB->setIconSize(pm.size()); QObject::connect(closeB, SIGNAL(clicked()), q, SLOT(closeActiveWindow())); maxcontrols->setFixedSize(maxcontrols->minimumSizeHint()); } b->setCornerWidget(maxcontrols); maxcontrols->show(); if (!active && becomeActive) { active = (QWorkspaceChild*)becomeActive->parentWidget(); active->setActive(true); becomeActive = 0; emit q->windowActivated(active->windowWidget()); } if (active) { if (!maxtools) { maxtools = new QLabel(q->window()); maxtools->setObjectName(QLatin1String("qt_maxtools")); maxtools->installEventFilter(q); } if (active->windowWidget() && !active->windowWidget()->windowIcon().isNull()) { QIcon icon = active->windowWidget()->windowIcon(); int iconSize = maxcontrols->size().height(); maxtools->setPixmap(icon.pixmap(QSize(iconSize, iconSize))); } else { QPixmap pm = q->style()->standardPixmap(QStyle::SP_TitleBarMenuButton); if (pm.isNull()) { pm = QPixmap(14,14); pm.fill(Qt::black); } maxtools->setPixmap(pm); } b->setCornerWidget(maxtools, Qt::TopLeftCorner); maxtools->show(); } }}void QWorkspacePrivate::hideMaximizeControls(){ Q_Q(QWorkspace); if (!q->style()->styleHint(QStyle::SH_Workspace_FillSpaceOnMaximize, 0, q)) { if (maxmenubar) { maxmenubar->setCornerWidget(0, Qt::TopLeftCorner); maxmenubar->setCornerWidget(0, Qt::TopRightCorner); } delete maxcontrols; maxcontrols = 0; delete maxtools; maxtools = 0; } //unmerge the titlebar/modification state if (topTitle.size()) { inTitleChange = true; q->window()->setWindowTitle(topTitle); inTitleChange = false; } q->window()->setWindowModified(false);}/*! Closes the child window that is currently active. \sa closeAllWindows()*/void QWorkspace::closeActiveWindow(){ Q_D(QWorkspace); if (d->maxWindow && d->maxWindow->windowWidget()) d->maxWindow->windowWidget()->close(); else if (d->active && d->active->windowWidget()) d->active->windowWidget()->close(); d->updateWorkspace();}/*! Closes all child windows. If any child window fails to accept the close event, the remaining windows will remain open. \sa closeActiveWindow()*/void QWorkspace::closeAllWindows(){ Q_D(QWorkspace); bool did_close = true; QList<QWorkspaceChild *>::const_iterator it = d->windows.constBegin(); while (it != d->windows.constEnd() && did_close) { QWorkspaceChild *c = *it; ++it; if (c->windowWidget() && !c->windowWidget()->isHidden()) did_close = c->windowWidget()->close(); }}void QWorkspacePrivate::_q_normalizeActiveWindow(){ if (maxWindow) maxWindow->showNormal(); else if (active) active->showNormal();}void QWorkspacePrivate::_q_minimizeActiveWindow(){ if (maxWindow) maxWindow->showMinimized(); else if (active) active->showMinimized();}void QWorkspacePrivate::_q_showOperationMenu(){ Q_Q(QWorkspace); if (!active || !active->windowWidget()) return; Q_ASSERT((active->windowWidget()->windowFlags() & Qt::WindowSystemMenuHint)); QPoint p; QMenu *popup = active->titlebar->isTool() ? toolPopup : this->popup; if (q->isRightToLeft()) { p = QPoint(active->windowWidget()->mapToGlobal(QPoint(active->windowWidget()->width(),0))); p.rx() -= popup->sizeHint().width(); } else { p = QPoint(active->windowWidget()->mapToGlobal(QPoint(0,0))); } if (!active->isVisible()) { p = active->iconWidget()->mapToGlobal(QPoint(0,0)); p.ry() -= popup->sizeHint().height(); } _q_popupOperationMenu(p);}void QWorkspacePrivate::_q_popupOperationMenu(const QPoint& p){ if (!active || !active->windowWidget() || !(active->windowWidget()->windowFlags() & Qt::WindowSystemMenuHint)) return; if ((active->titlebar->isTool())) toolPopup->popup(p); else popup->popup(p);}void QWorkspacePrivate::_q_updateActions(){ Q_Q(QWorkspace); for (int i = 1; i < NCountAct-1; i++) { bool enable = active != 0; actions[i]->setEnabled(enable); } if (!active || !active->windowWidget()) return; QWidget *windowWidget = active->windowWidget(); bool canResize = windowWidget->maximumSize() != windowWidget->minimumSize(); actions[QWorkspacePrivate::ResizeAct]->setEnabled(canResize); actions[QWorkspacePrivate::MinimizeAct]->setEnabled((windowWidget->windowFlags() & Qt::WindowMinimizeButtonHint)); actions[QWorkspacePrivate::MaximizeAct]->setEnabled((windowWidget->windowFlags() & Qt::WindowMaximizeButtonHint) && canResize); if (active == maxWindow) { actions[QWorkspacePrivate::MoveAct]->setEnabled(false); actions[QWorkspacePrivate::ResizeAct]->setEnabled(false); actions[QWorkspacePrivate::MaximizeAct]->setEnabled(false); actions[QWorkspacePrivate::RestoreAct]->setEnabled(true); } else if (active->isVisible()){ actions[QWorkspacePrivate::RestoreAct]->setEnabled(false); } else { actions[QWorkspacePrivate::MoveAct]->setEnabled(false); actions[QWorkspacePrivate::ResizeAct]->setEnabled(false); actions[QWorkspacePrivate::MinimizeAct]->setEnabled(false); actions[QWorkspacePrivate::RestoreAct]->setEnabled(true); } if (active->shademode) { actions[QWorkspacePrivate::ShadeAct]->setIcon( QIcon(q->style()->standardPixmap(QStyle::SP_TitleBarUnshadeButton))); actions[QWorkspacePrivate::ShadeAct]->setText(QWorkspace::tr("&Unshade")); } else { actions[QWorkspacePrivate::ShadeAct]->setIcon( QIcon(q->style()->standardPixmap(QStyle::SP_TitleBarShadeButton))); actions[QWorkspacePrivate::ShadeAct]->setText(QWorkspace::tr("Sh&ade")); } actions[QWorkspacePrivate::StaysOnTopAct]->setEnabled(!active->shademode && canResize); actions[QWorkspacePrivate::StaysOnTopAct]->setChecked( (active->windowWidget()->windowFlags() & Qt::WindowStaysOnTopHint));}void QWorkspacePrivate::_q_operationMenuActivated(QAction *action){ if (!active) return; if(action == actions[QWorkspacePrivate::RestoreAct]) { active->showNormal(); } else if(action == actions[QWorkspacePrivate::MoveAct]) { active->doMove(); } else if(action == actions[QWorkspacePrivate::ResizeAct]) { if (active->shademode) active->showShaded(); active->doResize(); } else if(action == actions[QWorkspacePrivate::MinimizeAct]) { active->showMinimized(); } else if(action == actions[QWorkspacePrivate::MaximizeAct]) { active->showMaximized(); } else if(action == actions[QWorkspacePrivate::ShadeAct]) { active->showShaded(); } else if(action == actions[QWorkspacePrivate::StaysOnTopAct]) { if(QWidget* w = active->windowWidget()) { if ((w->windowFlags() & Qt::WindowStaysOnTopHint)) { w->overrideWindowFlags(w->windowFlags() & ~Qt::WindowStaysOnTopHint); } else { w->overrideWindowFlags(w->windowFlags() | Qt::WindowStaysOnTopHint); w->parentWidget()->raise(); } } }}void QWorkspacePrivate::hideChild(QWorkspaceChild *c){ Q_Q(QWorkspace);// bool updatesEnabled = q->updatesEnabled();// q->setUpdatesEnabled(false); focus.removeAll(c); QRect restore; if (maxWindow == c) restore = maxRestore; if (active == c) { q->setFocus(); q->activatePr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -