📄 q3titlebar.cpp
字号:
repaint(); 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::WindowMaximizeButtonHint) 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; repaint(); emit doClose(); return; } break; default: break; } } } else { e->ignore(); }}void Q3TitleBar::mouseMoveEvent(QMouseEvent *e){ Q_D(Q3TitleBar); e->accept(); switch (d->buttonDown) { case QStyle::SC_None: if(autoRaise()) repaint(); break; case QStyle::SC_TitleBarSysMenu: break; case QStyle::SC_TitleBarShadeButton: case QStyle::SC_TitleBarUnshadeButton: case QStyle::SC_TitleBarNormalButton: case QStyle::SC_TitleBarMinButton: case QStyle::SC_TitleBarMaxButton: case QStyle::SC_TitleBarCloseButton: { QStyle::SubControl last_ctrl = d->buttonDown; QStyleOptionTitleBar opt = d->getStyleOption(); d->buttonDown = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, e->pos(), this); if (d->buttonDown != last_ctrl) d->buttonDown = QStyle::SC_None; repaint(); d->buttonDown = last_ctrl; } break; case QStyle::SC_TitleBarLabel: if (d->buttonDown == QStyle::SC_TitleBarLabel && d->movable && d->pressed) { if ((d->moveOffset - mapToParent(e->pos())).manhattanLength() >= 4) { QPoint p = mapFromGlobal(e->globalPos()); QWidget *parent = d->window ? d->window->parentWidget() : 0; if(parent && parent->inherits("Q3WorkspaceChild")) { 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); } } else { QStyle::SubControl last_ctrl = d->buttonDown; d->buttonDown = QStyle::SC_None; if(d->buttonDown != last_ctrl) repaint(); } break; default: break; }}void Q3TitleBar::resizeEvent(QResizeEvent *r){ QWidget::resizeEvent(r); cutText();}bool Q3TitleBar::isTool() const{ return (d_func()->flags & Qt::WindowType_Mask) == Qt::Tool;}void Q3TitleBar::paintEvent(QPaintEvent *){ Q_D(Q3TitleBar); QStyleOptionTitleBar opt = d->getStyleOption(); opt.subControls = QStyle::SC_TitleBarLabel; opt.activeSubControls = d->buttonDown; 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; if (underMouse()) { under_mouse = style()->hitTestComplexControl(QStyle::CC_TitleBar, &opt, mapFromGlobal(QCursor::pos()), this); opt.activeSubControls |= under_mouse; if (d->pressed) opt.state |= QStyle::State_Sunken; else if(autoRaise()) opt.state |= QStyle::State_MouseOver; } opt.palette.setCurrentColorGroup(usesActiveColor() ? QPalette::Active : QPalette::Inactive); QPainter p(this); if (!windowTitle().isEmpty()) opt.titleBarFlags |= Qt::WindowTitleHint; style()->drawComplexControl(QStyle::CC_TitleBar, &opt, &p, this);}void Q3TitleBar::mouseDoubleClickEvent(QMouseEvent *e){ Q_D(Q3TitleBar); if (e->button() != Qt::LeftButton) { e->ignore(); return; } e->accept(); QStyleOptionTitleBar opt = d->getStyleOption(); 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::WStyle_SysMenu) emit doClose(); break; default: break; }}void Q3TitleBar::cutText(){ Q_D(Q3TitleBar); QFontMetrics fm(font()); QStyleOptionTitleBar opt = d->getStyleOption(); int maxw = style()->subControlRect(QStyle::CC_TitleBar, &opt, QStyle::SC_TitleBarLabel, this).width(); if (!d->window) return; QString txt = d->window->windowTitle(); if (style()->styleHint(QStyle::SH_TitleBar_ModifyNotification, 0, this) && d->window && d->window->isWindowModified()) txt += QLatin1String(" *"); QString cuttext = txt; if (fm.width(txt + QLatin1Char('m')) > maxw) { int i = txt.length(); int dotlength = fm.width(QLatin1String("...")); while (i>0 && fm.width(txt.left(i)) + dotlength > maxw) i--; if(i != (int)txt.length()) cuttext = txt.left(i) + QLatin1String("..."); } setWindowTitle(cuttext);}void Q3TitleBar::leaveEvent(QEvent *){ if(autoRaise() && !d_func()->pressed) repaint();}void Q3TitleBar::enterEvent(QEvent *){ if(autoRaise() && !d_func()->pressed) repaint(); QEvent e(QEvent::Leave); QApplication::sendEvent(parentWidget(), &e);}void Q3TitleBar::setActive(bool active){ Q_D(Q3TitleBar); if (d->act == active) return ; d->act = active; update();}bool Q3TitleBar::isActive() const{ return d_func()->act;}bool Q3TitleBar::usesActiveColor() const{ return (isActive() && isActiveWindow()) || (!window() && QWidget::window()->isActiveWindow());}QWidget *Q3TitleBar::window() const{ return d_func()->window;}bool Q3TitleBar::event(QEvent *e){ Q_D(Q3TitleBar); if (d->inevent) return QWidget::event(e); d->inevent = true; if (e->type() == QEvent::ApplicationPaletteChange) { d->readColors(); return true; } else if (e->type() == QEvent::WindowActivate) { setActive(d->act); } else if (e->type() == QEvent::WindowDeactivate) { bool wasActive = d->act; setActive(false); d->act = wasActive; } else if (e->type() == QEvent::WindowIconChange) { update(); } else if (e->type() == QEvent::WindowTitleChange) { cutText(); update(); } d->inevent = false; return QWidget::event(e);}void Q3TitleBar::setMovable(bool b){ d_func()->movable = b;}bool Q3TitleBar::isMovable() const{ return d_func()->movable;}void Q3TitleBar::setAutoRaise(bool b){ d_func()->autoraise = b;}bool Q3TitleBar::autoRaise() const{ return d_func()->autoraise;}QSize Q3TitleBar::sizeHint() const{ ensurePolished(); QStyleOptionTitleBar opt = d_func()->getStyleOption(); QRect menur = style()->subControlRect(QStyle::CC_TitleBar, &opt, QStyle::SC_TitleBarSysMenu, this); return QSize(menur.width(), style()->pixelMetric(QStyle::PM_TitleBarHeight, &opt, this));}#endif //QT_NO_TITLEBAR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -