QtCanpool 3.3.0
载入中...
搜索中...
未找到
windowsystem_p.h
浏览该文件的文档.
1
5#ifndef WINDOWSYSTEM_P_H
6#define WINDOWSYSTEM_P_H
7
8//
9// W A R N I N G !!!
10// -----------------
11//
12// This file is not part of the QxWindow API. It is used purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or may even be removed.
15//
16
17#include "windowkit_p.h"
18#include <QtGui/QMouseEvent>
19#include <QtGui/QWindow>
20
21// Don't include this header in any header files.
22
24
25class WindowMoveManipulator : public QObject
26{
27public:
28 explicit WindowMoveManipulator(QWindow *targetWindow)
29 : QObject(targetWindow)
30 , target(targetWindow)
31 , initialMousePosition(QCursor::pos())
32 , initialWindowPosition(targetWindow->position())
33 {
34 target->installEventFilter(this);
35 }
36protected:
37 bool eventFilter(QObject *obj, QEvent *event) override
38 {
39 Q_UNUSED(obj);
40 switch (event->type()) {
41 case QEvent::MouseMove: {
42 Qt::WindowStates states = target->windowStates();
43 // FIXME: don't know the normal size of target, so disable move when maximized
44 if (states.testFlag(Qt::WindowMaximized) || states.testFlag(Qt::WindowFullScreen)) {
45 return false;
46 }
47 auto mouseEvent = static_cast<QMouseEvent *>(event);
48 QPoint delta = getMouseEventGlobalPos(mouseEvent) - initialMousePosition;
49 target->setPosition(initialWindowPosition + delta);
50 return true;
51 }
52
53 case QEvent::MouseButtonRelease: {
54 if (target->y() < 0) {
55 target->setPosition(target->x(), 0);
56 }
57 target->removeEventFilter(this);
58 deleteLater();
59 }
60
61 default:
62 break;
63 }
64 return false;
65 }
66private:
67 QWindow *target;
68 QPoint initialMousePosition;
69 QPoint initialWindowPosition;
70};
71
72class WindowResizeManipulator : public QObject
73{
74public:
75 WindowResizeManipulator(QWindow *targetWindow, Qt::Edges edges)
76 : QObject(targetWindow)
77 , target(targetWindow)
78 , initialMousePosition(QCursor::pos())
79 , initialWindowRect(target->geometry())
80 , resizeEdges(edges)
81 {
82 target->installEventFilter(this);
83 }
84protected:
85 bool eventFilter(QObject *obj, QEvent *event) override
86 {
87 Q_UNUSED(obj);
88 switch (event->type()) {
89 case QEvent::MouseMove: {
90 auto mouseEvent = static_cast<QMouseEvent *>(event);
91 QPoint globalMousePos = getMouseEventGlobalPos(mouseEvent);
92 QRect windowRect = initialWindowRect;
93
94 if (resizeEdges & Qt::LeftEdge) {
95 int delta = globalMousePos.x() - initialMousePosition.x();
96 windowRect.setLeft(initialWindowRect.left() + delta);
97 }
98 if (resizeEdges & Qt::RightEdge) {
99 int delta = globalMousePos.x() - initialMousePosition.x();
100 windowRect.setRight(initialWindowRect.right() + delta);
101 }
102 if (resizeEdges & Qt::TopEdge) {
103 int delta = globalMousePos.y() - initialMousePosition.y();
104 windowRect.setTop(initialWindowRect.top() + delta);
105 }
106 if (resizeEdges & Qt::BottomEdge) {
107 int delta = globalMousePos.y() - initialMousePosition.y();
108 windowRect.setBottom(initialWindowRect.bottom() + delta);
109 }
110
111 target->setGeometry(windowRect);
112 return true;
113 }
114
115 case QEvent::MouseButtonRelease: {
116 target->removeEventFilter(this);
117 deleteLater();
118 }
119
120 default:
121 break;
122 }
123 return false;
124 }
125private:
126 QWindow *target;
127 QPoint initialMousePosition;
128 QRect initialWindowRect;
129 Qt::Edges resizeEdges;
130};
131
132// QWindow::startSystemMove() and QWindow::startSystemResize() is first supported at Qt 5.15
133// QWindow::startSystemResize() returns false on macOS
134// QWindow::startSystemMove() and QWindow::startSystemResize() returns false on Linux Unity DE
135
136// When the new API fails, we emulate the window actions using the classical API.
137
138static inline void startSystemMove(QWindow *window)
139{
140#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
141 std::ignore = new WindowMoveManipulator(window);
142#elif defined(Q_OS_LINUX)
143 if (window->startSystemMove()) {
144 return;
145 }
146 std::ignore = new WindowMoveManipulator(window);
147#else
148 window->startSystemMove();
149#endif
150}
151
152static inline void startSystemResize(QWindow *window, Qt::Edges edges)
153{
154#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))
155 std::ignore = new WindowResizeManipulator(window, edges);
156#elif defined(Q_OS_MAC) || defined(Q_OS_LINUX)
157 if (window->startSystemResize(edges)) {
158 return;
159 }
160 std::ignore = new WindowResizeManipulator(window, edges);
161#else
162 window->startSystemResize(edges);
163#endif
164}
165
167
168#endif // WINDOWSYSTEM_P_H
WindowMoveManipulator(QWindow *targetWindow)
bool eventFilter(QObject *obj, QEvent *event) override
bool eventFilter(QObject *obj, QEvent *event) override
WindowResizeManipulator(QWindow *targetWindow, Qt::Edges edges)
QPoint getMouseEventGlobalPos(const QMouseEvent *event)
Definition windowkit_p.h:78
QColor window
#define QX_WINDOW_END_NAMESPACE
#define QX_WINDOW_BEGIN_NAMESPACE