QtCanpool 3.3.0
载入中...
搜索中...
未找到
windowbuttongroup.cpp
浏览该文件的文档.
1
5#include "windowbuttongroup.h"
7#include "ribbonmanager.h"
8
9#include <QResizeEvent>
10#include <QScopedPointer>
11#include <QStyle>
12#include <QToolButton>
13#include <QHBoxLayout>
14#include <QTimer>
15#include <QCoreApplication>
16
18
19#define MIN_BUTTON_WIDTH 30
20#define MAX_BUTTON_WIDTH 30
21#define CLS_BUTTON_WIDTH 40
22
23WindowButton::WindowButton(QWidget *p)
24 : QToolButton(p)
25{
26 setAutoRaise(true);
27}
28
30 : m_closeButton(Q_NULLPTR)
31 , m_minimizeButton(Q_NULLPTR)
32 , m_maximizeButton(Q_NULLPTR)
33 , m_iconScale(0.5)
34 , m_signalEnabled(false)
35{
36}
37
39{
41
43 m_minimizeButton->setObjectName(QStringLiteral("qx_MinimizeWindowButton"));
44 m_minimizeButton->setFixedWidth(MIN_BUTTON_WIDTH);
45 m_minimizeButton->setFocusPolicy(Qt::NoFocus);
46 m_minimizeButton->setIconSize(m_minimizeButton->size() * m_iconScale);
47 m_minimizeButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
48 connect(m_minimizeButton, &QAbstractButton::clicked, this, &WindowButtonGroupPrivate::buttonClicked);
49
51 m_maximizeButton->setObjectName(QStringLiteral("qx_MaximizeWindowButton"));
52 m_maximizeButton->setFixedWidth(MAX_BUTTON_WIDTH);
53 m_maximizeButton->setCheckable(true);
54 m_maximizeButton->setFocusPolicy(Qt::NoFocus);
55 m_maximizeButton->setIconSize(m_maximizeButton->size() * m_iconScale);
56 m_maximizeButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
57 connect(m_maximizeButton, &QAbstractButton::clicked, this, &WindowButtonGroupPrivate::buttonClicked);
58
60 m_closeButton->setObjectName(QStringLiteral("qx_CloseWindowButton"));
61 m_closeButton->setFixedWidth(CLS_BUTTON_WIDTH);
62 m_closeButton->setFocusPolicy(Qt::NoFocus);
63 m_closeButton->setIconSize(m_closeButton->size() * m_iconScale);
64 m_closeButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
65 connect(m_closeButton, &QAbstractButton::clicked, this, &WindowButtonGroupPrivate::buttonClicked);
66
67 QHBoxLayout *lay = new QHBoxLayout(q);
68 lay->setSpacing(0);
69 lay->setContentsMargins(1, 0, 0, 1);
70 lay->addWidget(m_minimizeButton);
71 lay->addWidget(m_maximizeButton);
72 lay->addWidget(m_closeButton);
73}
74
75void WindowButtonGroupPrivate::updateButton(Qt::WindowFlags flags)
76{
77 m_minimizeButton->setVisible(flags & Qt::WindowMinimizeButtonHint);
78 m_maximizeButton->setVisible(flags & Qt::WindowMaximizeButtonHint);
79 m_closeButton->setVisible(flags & Qt::WindowCloseButtonHint);
80}
81
88
90{
91 int width = 0;
92 int height = groupHeight();
93
94 if (m_closeButton->isVisible()) {
95 width += CLS_BUTTON_WIDTH;
96 }
97 if (m_maximizeButton->isVisible()) {
98 width += MAX_BUTTON_WIDTH;
99 }
100 if (m_minimizeButton->isVisible()) {
101 width += MIN_BUTTON_WIDTH;
102 }
103 return QSize(width, height);
104}
105
107{
108 // In the WpsLiteStyle style, tabBarHeight may be smaller than titleBarHeight,
109 // which causes the window buttons to cover the ribbon area, so use the smallest one
110 return qMin(RibbonElementStyleOpt.titleBarHeight(), RibbonElementStyleOpt.tabBarHeight());
111}
112
114{
116 WindowButton *button = qobject_cast<WindowButton *>(sender());
117
118 if (m_signalEnabled) {
119 if (button == m_minimizeButton) {
120 Q_EMIT q->buttonMinimizeClicked();
121 } else if (button == m_maximizeButton) {
122 Q_EMIT q->buttonMaximzieClicked();
123 } else if (button == m_closeButton) {
124 Q_EMIT q->buttonCloseClicked();
125 }
126 } else {
127 QWidget *pw = q->parentWidget();
128 if (pw) {
129 if (button == m_minimizeButton) {
130 pw->showMinimized();
131 } else if (button == m_maximizeButton) {
132 if (pw->isMaximized()) {
133 pw->showNormal();
134 } else {
135 pw->showMaximized();
136 }
137 } else if (button == m_closeButton) {
138 pw->close();
139 }
140 }
141 }
142 // It's a Qt issue that if a QAbstractButton::clicked triggers a window's maximization,
143 // the button remains to be hovered until the mouse move. As a result, we need to
144 // manually send leave events to the button.
145 if (button == m_maximizeButton) {
146 QTimer::singleShot(50, this, [this]() {
147 QCoreApplication::postEvent(m_maximizeButton, new QEvent(QEvent::Leave));
148 });
149 }
150}
151
152WindowButtonGroup::WindowButtonGroup(QWidget *parent, Qt::WindowFlags flags)
153 : QWidget(parent)
154{
157 d->init();
158 updateWindowFlags(flags);
159}
160
162{
163 if (this->parent()) {
164 this->parent()->removeEventFilter(this);
165 }
167}
168
169void WindowButtonGroup::updateWindowFlags(Qt::WindowFlags flags)
170{
172 if (flags == Qt::WindowFlags()) {
173 if (QWidget *pw = parentWidget()) {
174 flags = pw->windowFlags();
175 }
176 }
177 d->updateButton(flags);
178}
179
181{
183 if (d->m_iconScale == scale) {
184 return;
185 }
186 d->m_iconScale = scale;
187 d->updateButtonIconSize();
188}
189
191{
193 bool on = s.testFlag(Qt::WindowMaximized);
194 d->m_maximizeButton->setChecked(on);
195 d->m_maximizeButton->setToolTip(on ? tr("Restore") : tr("Maximize"));
196}
197
199{
200 Q_D(const WindowButtonGroup);
201 return d->sizeHint();
202}
203
205{
206 Q_D(const WindowButtonGroup);
207 return d->m_maximizeButton;
208}
209
216{
217 Q_D(const WindowButtonGroup);
218 return d->m_signalEnabled;
219}
220
222{
224 d->m_signalEnabled = enable;
225}
226
void updateButton(Qt::WindowFlags flags)
void updateWindowFlags(Qt::WindowFlags flags)
virtual QSize sizeHint() const override
QWidget * widgetForMaximizeButton() const
WindowButtonGroup(QWidget *parent, Qt::WindowFlags flags=Qt::WindowFlags())
bool signalIsEnabled() const
default is disabled
void setWindowStates(Qt::WindowStates s)
void setIconScale(qreal scale=0.5)
#define QX_INIT_PRIVATE(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_FINI_PRIVATE()
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE
QColor button
#define RibbonElementStyleOpt
#define MIN_BUTTON_WIDTH
#define MAX_BUTTON_WIDTH
#define CLS_BUTTON_WIDTH