QtCanpool 3.3.0
载入中...
搜索中...
未找到
ribbonappwindow.cpp
浏览该文件的文档.
1
6#include "ribbonappwindow.h"
9
12
14
15class RibbonAppWindowPrivate
16{
17 QX_DECLARE_PUBLIC(RibbonAppWindow)
18public:
19 RibbonAppWindowPrivate();
20 void init();
21public:
22 WindowButtonGroup *m_windowButtonGroup;
23 WindowAgentWidget *m_windowAgent;
24};
25
26RibbonAppWindowPrivate::RibbonAppWindowPrivate()
27 : m_windowButtonGroup(Q_NULLPTR)
28 , m_windowAgent(Q_NULLPTR)
29{
30}
31
32void RibbonAppWindowPrivate::init()
33{
34 Q_Q(RibbonAppWindow);
35 RibbonBar *ribbonBar = q->ribbonBar();
36
37 if (Q_NULLPTR == m_windowAgent) {
38 m_windowAgent = new WindowAgentWidget(q);
39 m_windowAgent->setup(q);
40 m_windowAgent->setTitleBar(ribbonBar);
41 m_windowAgent->addCaptionClassName(QString::fromLatin1("QxRibbon::RibbonBar"));
42 }
43
44 if (Q_NULLPTR == m_windowButtonGroup) {
45 m_windowButtonGroup = new WindowButtonGroup(q);
46 m_windowButtonGroup->setSignalEnabled(true);
47 QObject::connect(m_windowButtonGroup, &WindowButtonGroup::buttonMinimizeClicked, q,
48 &RibbonAppWindow::showMinimized);
49 QObject::connect(m_windowButtonGroup, &WindowButtonGroup::buttonMaximzieClicked, q, [q]() {
50 if (q->isMaximized()) {
51 q->showNormal();
52 } else {
53 q->showMaximized();
54 }
55 });
56 QObject::connect(m_windowButtonGroup, &WindowButtonGroup::buttonCloseClicked, q, &RibbonAppWindow::close);
57 if (ribbonBar) {
58 ribbonBar->setWindowButtonGroup(m_windowButtonGroup);
59 }
60 m_windowAgent->setSystemButton(WindowAgentBase::Maximize, m_windowButtonGroup->widgetForMaximizeButton());
61 }
62 Qt::WindowStates s = q->windowState();
63 if (s.testFlag(Qt::WindowFullScreen)) {
64 m_windowButtonGroup->setVisible(false);
65 } else {
66 m_windowButtonGroup->setVisible(true);
67 }
68 m_windowButtonGroup->setWindowStates(s);
69 m_windowAgent->setHitTestVisible(m_windowButtonGroup, true);
70}
71
72RibbonAppWindow::RibbonAppWindow(QWidget *parent, Qt::WindowFlags flags)
74{
75 Q_UNUSED(flags);
77 Q_D(RibbonAppWindow);
78 d->init();
79 resizeRibbon();
80}
81
86
87void RibbonAppWindow::updateWindowFlags(Qt::WindowFlags flags)
88{
89 Q_D(RibbonAppWindow);
90 if (!(flags & Qt::WindowMaximizeButtonHint)) {
91 if (isMaximized() || isFullScreen()) {
92 showNormal();
93 }
94 }
96 if (d->m_windowButtonGroup) {
97 if (flags & Qt::WindowMaximizeButtonHint) {
98 d->m_windowAgent->setSystemButton(WindowAgentBase::Maximize,
99 d->m_windowButtonGroup->widgetForMaximizeButton());
100 } else {
101 d->m_windowAgent->removeSystemButton(WindowAgentBase::Maximize);
102 }
103 d->m_windowButtonGroup->updateWindowFlags(flags);
104 // FIXME: In the WpsLiteStyle style, there is a short time overlap between rightButtonGroup and
105 // windowButtonGroup. Because the button group will be displayed first, and then resize the ribbon.
106 // I tried to hide the button group first and display the button group after resize ribbon,
107 // but because resize ribbon is a trigger event and non-blocking, the button group was displayed
108 // before resize was completed, so I failed.
109 resizeRibbon();
110 }
111}
112
114{
115 Q_D(RibbonAppWindow);
116 switch (e->type()) {
117 case QEvent::WindowStateChange: {
118 Qt::WindowStates s = windowState();
119 if (d->m_windowButtonGroup) {
120 if (s.testFlag(Qt::WindowFullScreen)) {
121 d->m_windowButtonGroup->setVisible(false);
122 } else {
123 d->m_windowButtonGroup->setVisible(true);
124 }
125 d->m_windowButtonGroup->setWindowStates(s);
126 resizeRibbon();
127 }
128 Q_EMIT windowStateChanged(s);
129 } break;
130 default:
131 break;
132 }
133 return RibbonMainWindow::event(e);
134}
135
virtual bool event(QEvent *e) override
void updateWindowFlags(Qt::WindowFlags flags) override
RibbonBar 继承 QMenuBar, 在 RibbonWindow 中直接替换了原来的 QMenuBar
Definition ribbonbar.h:99
void setWindowButtonGroup(QWidget *widget)
virtual void updateWindowFlags(Qt::WindowFlags flags)
virtual bool event(QEvent *e) override
WindowAgentBase is the window agent for QtWidgets.
#define QX_APP_END_NAMESPACE
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_APP_BEGIN_NAMESPACE
#define QX_FINI_PRIVATE()
#define QX_RIBBON_PREPEND_NAMESPACE(name)
#define QX_RIBBON_USE_NAMESPACE
#define QX_WINDOW_USE_NAMESPACE