📄 qworkspace.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qworkspace.h"#ifndef QT_NO_WORKSPACE#include "qapplication.h"#include "qbitmap.h"#include "qcursor.h"#include "qdatetime.h"#include "qdesktopwidget.h"#include "qevent.h"#include "qhash.h"#include "qicon.h"#include "qimage.h"#include "qlabel.h"#include "qlayout.h"#include "qmenubar.h"#include "qmenu.h"#include "qpainter.h"#include "qpointer.h"#include "qscrollbar.h"#include "qstyle.h"#include "qstyleoption.h"#include "qtooltip.h"#include "qdebug.h"#include <private/qwidget_p.h>#include <private/qwidgetresizehandler_p.h>#include <private/qlayoutengine_p.h>class QWorkspaceTitleBarPrivate;/*************************************************************** QMDIControl** Used for displaying MDI controls in a maximized MDI window**/class QMDIControl : public QWidget{ Q_OBJECTsignals: void _q_minimize(); void _q_restore(); void _q_close();public: QMDIControl(QWidget *widget);private: QSize sizeHint() const; void paintEvent(QPaintEvent *event); void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void leaveEvent(QEvent *event); bool event(QEvent *event); void initStyleOption(QStyleOptionComplex *option) const; QStyle::SubControl activeControl; //control locked by pressing and holding the mouse QStyle::SubControl hoverControl; //previously active hover control, used for tracking repaints};bool QMDIControl::event(QEvent *event){ if (event->type() == QEvent::ToolTip) { QStyleOptionComplex opt; initStyleOption(&opt);#ifndef QT_NO_TOOLTIP QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); QStyle::SubControl ctrl = style()->hitTestComplexControl(QStyle::CC_MdiControls, &opt, helpEvent->pos(), this); if (ctrl == QStyle::SC_MdiCloseButton) QToolTip::showText(helpEvent->globalPos(), QWorkspace::tr("Close")); else if (ctrl == QStyle::SC_MdiMinButton) QToolTip::showText(helpEvent->globalPos(), QWorkspace::tr("Minimize")); else if (ctrl == QStyle::SC_MdiNormalButton) QToolTip::showText(helpEvent->globalPos(), QWorkspace::tr("Restore Down")); else QToolTip::hideText();#endif // QT_NO_TOOLTIP } return QWidget::event(event);}void QMDIControl::initStyleOption(QStyleOptionComplex *option) const{ option->initFrom(this); option->subControls = QStyle::SC_All; option->activeSubControls = QStyle::SC_None;}QMDIControl::QMDIControl(QWidget *widget) : QWidget(widget), activeControl(QStyle::SC_None), hoverControl(QStyle::SC_None){ setObjectName(QLatin1String("qt_maxcontrols")); setFocusPolicy(Qt::NoFocus); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setMouseTracking(true);}QSize QMDIControl::sizeHint() const{ ensurePolished(); QStyleOptionComplex opt; initStyleOption(&opt); QSize size(48, 16); return style()->sizeFromContents(QStyle::CT_MdiControls, &opt, size, this);}void QMDIControl::mousePressEvent(QMouseEvent *event){ if (event->button() != Qt::LeftButton) { event->ignore(); return; } QStyleOptionComplex opt; initStyleOption(&opt); QStyle::SubControl ctrl = style()->hitTestComplexControl(QStyle::CC_MdiControls, &opt, event->pos(), this); activeControl = ctrl; update();}void QMDIControl::mouseReleaseEvent(QMouseEvent *event){ if (event->button() != Qt::LeftButton) { event->ignore(); return; } QStyleOptionTitleBar opt; initStyleOption(&opt); QStyle::SubControl under_mouse = style()->hitTestComplexControl(QStyle::CC_MdiControls, &opt, event->pos(), this); if (under_mouse == activeControl) { switch (activeControl) { case QStyle::SC_MdiCloseButton: emit _q_close(); break; case QStyle::SC_MdiNormalButton: emit _q_restore(); break; case QStyle::SC_MdiMinButton: emit _q_minimize(); break; default: break; } } activeControl = QStyle::SC_None; update();}void QMDIControl::leaveEvent(QEvent * /*event*/){ hoverControl = QStyle::SC_None; update();}void QMDIControl::mouseMoveEvent(QMouseEvent *event){ QStyleOptionTitleBar opt; initStyleOption(&opt); QStyle::SubControl under_mouse = style()->hitTestComplexControl(QStyle::CC_MdiControls, &opt, event->pos(), this); //test if hover state changes if (hoverControl != under_mouse) { hoverControl = under_mouse; update(); }}void QMDIControl::paintEvent(QPaintEvent *){ QPainter p(this); QStyleOptionComplex opt; initStyleOption(&opt); if (activeControl == hoverControl) { opt.activeSubControls = activeControl; opt.state |= QStyle::State_Sunken; } else if (hoverControl != QStyle::SC_None && (activeControl == QStyle::SC_None)) { opt.activeSubControls = hoverControl; opt.state |= QStyle::State_MouseOver; } style()->drawComplexControl(QStyle::CC_MdiControls, &opt, &p, this);}class QWorkspaceTitleBar : public QWidget{ Q_OBJECT Q_DECLARE_PRIVATE(QWorkspaceTitleBar) Q_PROPERTY(bool autoRaise READ autoRaise WRITE setAutoRaise) Q_PROPERTY(bool movable READ isMovable WRITE setMovable)public: QWorkspaceTitleBar (QWidget *w, QWidget *parent, Qt::WindowFlags f = 0); ~QWorkspaceTitleBar(); bool isActive() const; bool usesActiveColor() const; bool isMovable() const; void setMovable(bool); bool autoRaise() const; void setAutoRaise(bool); QWidget *window() const; bool isTool() const; QSize sizeHint() const; void initStyleOption(QStyleOptionTitleBar *option) const;public slots: void setActive(bool);signals: void doActivate(); void doNormal(); void doClose(); void doMaximize(); void doMinimize(); void doShade(); void showOperationMenu(); void popupOperationMenu(const QPoint&); void doubleClicked();protected: bool event(QEvent *); void contextMenuEvent(QContextMenuEvent *); void mousePressEvent(QMouseEvent *); void mouseDoubleClickEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void enterEvent(QEvent *e); void leaveEvent(QEvent *e); void paintEvent(QPaintEvent *p);private: Q_DISABLE_COPY(QWorkspaceTitleBar)};class QWorkspaceTitleBarPrivate : public QWidgetPrivate{ Q_DECLARE_PUBLIC(QWorkspaceTitleBar)public: QWorkspaceTitleBarPrivate() : lastControl(QStyle::SC_None),#ifndef QT_NO_TOOLTIP toolTip(0),#endif act(0), window(0), movable(1), pressed(0), autoraise(0), moving(0) { } Qt::WindowFlags flags; QStyle::SubControl buttonDown; QStyle::SubControl lastControl; QPoint moveOffset;#ifndef QT_NO_TOOLTIP QToolTip *toolTip;#endif bool act :1; QPointer<QWidget> window; bool movable :1; bool pressed :1; bool autoraise :1; bool moving : 1; int titleBarState() const; void readColors();};inline int QWorkspaceTitleBarPrivate::titleBarState() const{ Q_Q(const QWorkspaceTitleBar); uint state = window ? window->windowState() : static_cast<Qt::WindowStates>(Qt::WindowNoState); state |= uint((act && q->isActiveWindow()) ? QStyle::State_Active : QStyle::State_None); return (int)state;}void QWorkspaceTitleBar::initStyleOption(QStyleOptionTitleBar *option) const{ Q_D(const QWorkspaceTitleBar); option->initFrom(this); //################ if (d->window && (d->flags & Qt::WindowTitleHint)) { option->text = d->window->windowTitle(); QIcon icon = d->window->windowIcon(); QSize s = icon.actualSize(QSize(64, 64)); option->icon = icon.pixmap(s); } option->subControls = QStyle::SC_All; option->activeSubControls = QStyle::SC_None; option->titleBarState = d->titleBarState(); option->titleBarFlags = d->flags; option->state &= ~QStyle::State_MouseOver;}QWorkspaceTitleBar::QWorkspaceTitleBar(QWidget *w, QWidget *parent, Qt::WindowFlags f) : QWidget(*new QWorkspaceTitleBarPrivate, parent, Qt::FramelessWindowHint){ Q_D(QWorkspaceTitleBar); if (f == 0 && w) f = w->windowFlags(); d->flags = f; d->window = w; d->buttonDown = QStyle::SC_None; d->act = 0; if (w) { if (w->maximumSize() != QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)) d->flags &= ~Qt::WindowMaximizeButtonHint; setWindowTitle(w->windowTitle()); } d->readColors(); setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); setMouseTracking(true); setAutoRaise(style()->styleHint(QStyle::SH_TitleBar_AutoRaise, 0, this));}QWorkspaceTitleBar::~QWorkspaceTitleBar(){}#ifdef Q_WS_WINstatic inline QRgb colorref2qrgb(COLORREF col){ return qRgb(GetRValue(col),GetGValue(col),GetBValue(col));}#endifvoid QWorkspaceTitleBarPrivate::readColors(){ Q_Q(QWorkspaceTitleBar); QPalette pal = 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()) { pal.setColor(QPalette::Active, QPalette::Highlight, colorref2qrgb(GetSysColor(COLOR_ACTIVECAPTION))); pal.setColor(QPalette::Inactive, QPalette::Highlight, colorref2qrgb(GetSysColor(COLOR_INACTIVECAPTION))); pal.setColor(QPalette::Active, QPalette::HighlightedText, colorref2qrgb(GetSysColor(COLOR_CAPTIONTEXT))); pal.setColor(QPalette::Inactive, QPalette::HighlightedText, colorref2qrgb(GetSysColor(COLOR_INACTIVECAPTIONTEXT))); if (QSysInfo::WindowsVersion != QSysInfo::WV_95 && QSysInfo::WindowsVersion != QSysInfo::WV_NT) { colorsInitialized = true; BOOL gradient; QT_WA({ SystemParametersInfo(SPI_GETGRADIENTCAPTIONS, 0, &gradient, 0); } , { SystemParametersInfoA(SPI_GETGRADIENTCAPTIONS, 0, &gradient, 0); }); if (gradient) { pal.setColor(QPalette::Active, QPalette::Base, colorref2qrgb(GetSysColor(COLOR_GRADIENTACTIVECAPTION))); pal.setColor(QPalette::Inactive, QPalette::Base, colorref2qrgb(GetSysColor(COLOR_GRADIENTINACTIVECAPTION))); } else { pal.setColor(QPalette::Active, QPalette::Base, pal.color(QPalette::Active, QPalette::Highlight)); pal.setColor(QPalette::Inactive, QPalette::Base, pal.color(QPalette::Inactive, QPalette::Highlight)); } } }#endif // Q_WS_WIN if (!colorsInitialized) { pal.setColor(QPalette::Active, QPalette::Highlight, pal.color(QPalette::Active, QPalette::Highlight)); pal.setColor(QPalette::Active, QPalette::Base, pal.color(QPalette::Active, QPalette::Highlight)); pal.setColor(QPalette::Inactive, QPalette::Highlight, pal.color(QPalette::Inactive, QPalette::Dark)); pal.setColor(QPalette::Inactive, QPalette::Base, pal.color(QPalette::Inactive, QPalette::Dark)); pal.setColor(QPalette::Inactive, QPalette::HighlightedText, pal.color(QPalette::Inactive, QPalette::Window)); } q->setPalette(pal); q->setActive(act);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -