📄 qworkspace.cpp
字号:
void QWorkspaceTitleBar::mousePressEvent(QMouseEvent *e){ Q_D(QWorkspaceTitleBar); if (!d->act) emit doActivate(); if (e->button() == Qt::LeftButton) { if (style()->styleHint(QStyle::SH_TitleBar_NoBorder, 0, 0) && !rect().adjusted(5, 5, -5, 0).contains(e->pos())) { // propagate border events to the QWidgetResizeHandler e->ignore(); return; } d->pressed = true; QStyleOptionTitleBar opt; initStyleOption(&opt); QStyle::SubControl ctrl = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this); switch (ctrl) { case QStyle::SC_TitleBarSysMenu: if (d->flags & Qt::WindowSystemMenuHint) { d->buttonDown = QStyle::SC_None; static QTime *t = 0; static QWorkspaceTitleBar *tc = 0; if (!t) t = new QTime; if (tc != this || t->elapsed() > QApplication::doubleClickInterval()) { emit showOperationMenu(); t->start(); tc = this; } else { tc = 0; emit doClose(); return; } } break; case QStyle::SC_TitleBarShadeButton: case QStyle::SC_TitleBarUnshadeButton: if (d->flags & Qt::WindowShadeButtonHint) d->buttonDown = ctrl; break; case QStyle::SC_TitleBarNormalButton: d->buttonDown = ctrl; break; case QStyle::SC_TitleBarMinButton: if (d->flags & Qt::WindowMinimizeButtonHint) d->buttonDown = ctrl; break; case QStyle::SC_TitleBarMaxButton: if (d->flags & Qt::WindowMaximizeButtonHint) d->buttonDown = ctrl; break; case QStyle::SC_TitleBarCloseButton: if (d->flags & Qt::WindowSystemMenuHint) d->buttonDown = ctrl; break; case QStyle::SC_TitleBarLabel: d->buttonDown = ctrl; d->moveOffset = mapToParent(e->pos()); break; default: break; } update(); } else { d->pressed = false; }}void QWorkspaceTitleBar::contextMenuEvent(QContextMenuEvent *e){ QStyleOptionTitleBar opt; initStyleOption(&opt); QStyle::SubControl ctrl = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this); if(ctrl == QStyle::SC_TitleBarLabel || ctrl == QStyle::SC_TitleBarSysMenu) { e->accept(); emit popupOperationMenu(e->globalPos()); } else { e->ignore(); }}void QWorkspaceTitleBar::mouseReleaseEvent(QMouseEvent *e){ Q_D(QWorkspaceTitleBar); if (!d->window) { // could have been deleted as part of a double click event on the sysmenu return; } if (e->button() == Qt::LeftButton && d->pressed) { if (style()->styleHint(QStyle::SH_TitleBar_NoBorder, 0, 0) && !rect().adjusted(5, 5, -5, 0).contains(e->pos())) { // propagate border events to the QWidgetResizeHandler e->ignore(); d->buttonDown = QStyle::SC_None; d->pressed = false; return; } e->accept(); QStyleOptionTitleBar opt; initStyleOption(&opt); QStyle::SubControl ctrl = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this); if (d->pressed) { update(); d->pressed = false; d->moving = false; } if (ctrl == d->buttonDown) { d->buttonDown = QStyle::SC_None; switch(ctrl) { case QStyle::SC_TitleBarShadeButton: case QStyle::SC_TitleBarUnshadeButton: if(d->flags & Qt::WindowShadeButtonHint) emit doShade(); break; case QStyle::SC_TitleBarNormalButton: if(d->flags & Qt::WindowMinMaxButtonsHint) emit doNormal(); break; case QStyle::SC_TitleBarMinButton: if(d->flags & Qt::WindowMinimizeButtonHint) { if (d->window && d->window->isMinimized()) emit doNormal(); else emit doMinimize(); } break; case QStyle::SC_TitleBarMaxButton: if(d->flags & Qt::WindowMaximizeButtonHint) { if(d->window && d->window->isMaximized()) emit doNormal(); else emit doMaximize(); } break; case QStyle::SC_TitleBarCloseButton: if(d->flags & Qt::WindowSystemMenuHint) { d->buttonDown = QStyle::SC_None; emit doClose(); return; } break; default: break; } } } else { e->ignore(); }}void QWorkspaceTitleBar::mouseMoveEvent(QMouseEvent *e){ Q_D(QWorkspaceTitleBar); e->ignore(); if ((e->buttons() & Qt::LeftButton) && style()->styleHint(QStyle::SH_TitleBar_NoBorder, 0, 0) && !rect().adjusted(5, 5, -5, 0).contains(e->pos()) && !d->pressed) { // propagate border events to the QWidgetResizeHandler return; } QStyleOptionTitleBar opt; initStyleOption(&opt); QStyle::SubControl under_mouse = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this); if(under_mouse != d->lastControl) { d->lastControl = under_mouse; update(); } switch (d->buttonDown) { case QStyle::SC_None: break; case QStyle::SC_TitleBarSysMenu: break; case QStyle::SC_TitleBarLabel: if (d->buttonDown == QStyle::SC_TitleBarLabel && d->movable && d->pressed) { if (d->moving || (d->moveOffset - mapToParent(e->pos())).manhattanLength() >= 4) { d->moving = true; QPoint p = mapFromGlobal(e->globalPos()); QWidget *parent = d->window ? d->window->parentWidget() : 0; if(parent && parent->inherits("QWorkspaceChild")) { QWidget *workspace = parent->parentWidget(); p = workspace->mapFromGlobal(e->globalPos()); if (!workspace->rect().contains(p)) { if (p.x() < 0) p.rx() = 0; if (p.y() < 0) p.ry() = 0; if (p.x() > workspace->width()) p.rx() = workspace->width(); if (p.y() > workspace->height()) p.ry() = workspace->height(); } } QPoint pp = p - d->moveOffset; if (!parentWidget()->isMaximized()) parentWidget()->move(pp); } } e->accept(); break; default: break; }}bool QWorkspaceTitleBar::isTool() const{ Q_D(const QWorkspaceTitleBar); return (d->flags & Qt::WindowType_Mask) == Qt::Tool;}// from qwidget.cppextern QString qt_setWindowTitle_helperHelper(const QString &, QWidget*);void QWorkspaceTitleBar::paintEvent(QPaintEvent *){ Q_D(QWorkspaceTitleBar); QStyleOptionTitleBar opt; initStyleOption(&opt); opt.subControls = QStyle::SC_TitleBarLabel; opt.activeSubControls = d->buttonDown; if (d->window && (d->flags & Qt::WindowTitleHint)) { QString title = qt_setWindowTitle_helperHelper(opt.text, d->window); int maxw = style()->subControlRect(QStyle::CC_TitleBar, &opt, QStyle::SC_TitleBarLabel, this).width(); opt.text = fontMetrics().elidedText(title, Qt::ElideRight, maxw); } if (d->flags & Qt::WindowSystemMenuHint) { opt.subControls |= QStyle::SC_TitleBarSysMenu | QStyle::SC_TitleBarCloseButton; if (d->window && (d->flags & Qt::WindowShadeButtonHint)) { if (d->window->isMinimized()) opt.subControls |= QStyle::SC_TitleBarUnshadeButton; else opt.subControls |= QStyle::SC_TitleBarShadeButton; } if (d->window && (d->flags & Qt::WindowMinMaxButtonsHint)) { if(d->window && d->window->isMinimized()) opt.subControls |= QStyle::SC_TitleBarNormalButton; else opt.subControls |= QStyle::SC_TitleBarMinButton; } if (d->window && (d->flags & Qt::WindowMaximizeButtonHint) && !d->window->isMaximized()) opt.subControls |= QStyle::SC_TitleBarMaxButton; } QStyle::SubControl under_mouse = QStyle::SC_None; under_mouse = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, mapFromGlobal(QCursor::pos()), this); if ((d->buttonDown == under_mouse) && d->pressed) { opt.state |= QStyle::State_Sunken; } else if( autoRaise() && under_mouse != QStyle::SC_None && !d->pressed) { opt.activeSubControls = under_mouse; opt.state |= QStyle::State_MouseOver; } opt.palette.setCurrentColorGroup(usesActiveColor() ? QPalette::Active : QPalette::Inactive); QPainter p(this); style()->drawComplexControl(QStyle::CC_TitleBar, &opt, &p, this);}void QWorkspaceTitleBar::mouseDoubleClickEvent(QMouseEvent *e){ Q_D(QWorkspaceTitleBar); if (e->button() != Qt::LeftButton) { e->ignore(); return; } e->accept(); QStyleOptionTitleBar opt; initStyleOption(&opt); switch (style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this)) { case QStyle::SC_TitleBarLabel: emit doubleClicked(); break; case QStyle::SC_TitleBarSysMenu: if (d->flags & Qt::WindowSystemMenuHint) emit doClose(); break; default: break; }}void QWorkspaceTitleBar::leaveEvent(QEvent *){ Q_D(QWorkspaceTitleBar); d->lastControl = QStyle::SC_None; if(autoRaise() && !d->pressed) update();}void QWorkspaceTitleBar::enterEvent(QEvent *){ Q_D(QWorkspaceTitleBar); if(autoRaise() && !d->pressed) update(); QEvent e(QEvent::Leave); QApplication::sendEvent(parentWidget(), &e);}void QWorkspaceTitleBar::setActive(bool active){ Q_D(QWorkspaceTitleBar); if (d->act == active) return ; d->act = active; update();}bool QWorkspaceTitleBar::isActive() const{ Q_D(const QWorkspaceTitleBar); return d->act;}bool QWorkspaceTitleBar::usesActiveColor() const{ return (isActive() && isActiveWindow()) || (!window() && QWidget::window()->isActiveWindow());}QWidget *QWorkspaceTitleBar::window() const{ Q_D(const QWorkspaceTitleBar); return d->window;}bool QWorkspaceTitleBar::event(QEvent *e){ Q_D(QWorkspaceTitleBar); if (e->type() == QEvent::ApplicationPaletteChange) { d->readColors(); } else if (e->type() == QEvent::WindowActivate || e->type() == QEvent::WindowDeactivate) { if (d->act) update(); } return QWidget::event(e);}void QWorkspaceTitleBar::setMovable(bool b){ Q_D(QWorkspaceTitleBar); d->movable = b;}bool QWorkspaceTitleBar::isMovable() const{ Q_D(const QWorkspaceTitleBar); return d->movable;}void QWorkspaceTitleBar::setAutoRaise(bool b){ Q_D(QWorkspaceTitleBar); d->autoraise = b;}bool QWorkspaceTitleBar::autoRaise() const{ Q_D(const QWorkspaceTitleBar); return d->autoraise;}QSize QWorkspaceTitleBar::sizeHint() const{ ensurePolished(); QStyleOptionTitleBar opt; initStyleOption(&opt); QRect menur = style()->subControlRect(QStyle::CC_TitleBar, &opt, QStyle::SC_TitleBarSysMenu, this); return QSize(menur.width(), style()->pixelMetric(QStyle::PM_TitleBarHeight, &opt, this));}/*! \class QWorkspace \obsolete \brief The QWorkspace widget provides a workspace window that can be used in an MDI application. \ingroup application This class is deprecated. Use QMdiArea instead. Multiple Document Interface (MDI) applications are typically composed of a main window containing a menu bar, a toolbar, and a central QWorkspace widget. The workspace itself is used to display a number of child windows, each of which is a widget. The workspace itself is an ordinary Qt widget. It has a standard constructor that takes a parent widget. Workspaces can be placed in any layout, but are typically given as the central widget in a QMainWindow: \code MainWindow::MainWindow() { workspace = new QWorkspace; setCentralWidget(workspace);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -