现有功能
1.在窗口上绘制任意大小的矩形。
2.通过边角的拖曳按钮改变矩形大小。
运行结果
源码
point_button.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#ifndef POINTBUTTON_H #define POINTBUTTON_H #include <QPushButton> #include <QWidget> #include <QMouseEvent> class PointButton : public QPushButton { public : PointButton(QWidget *parent); ~PointButton(); public : bool isPressed; // 用来判断用户是否正按在拖曳按钮上 protected : void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); private : void setQss(); // 设置拖曳按钮样式 private : float startX; // 用来移动拖曳按钮 float startY; }; #endif // POINTBUTTON_H |
point_button.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include "point_button.h" #include <QString> #include "window.h" PointButton::PointButton(QWidget *parent): QPushButton(parent) { this ->resize(10, 10); this ->isPressed = false ; this ->setQss(); } PointButton::~PointButton() { } void PointButton::setQss() { QString qss = "QPushButton {\n" "border-radius: 5px;\n" "border: 1px solid black;" "background-color: rgb(255, 255, 255);\n" "}\n" "QPushButton:hover {\n" "border-width: 2px;\n" "}" ; this ->setStyleSheet(qss); } void PointButton::mousePressEvent(QMouseEvent *event) { QPushButton::mousePressEvent(event); this ->startX = event->x(); this ->startY = event->y(); this ->isPressed = true ; } void PointButton::mouseMoveEvent(QMouseEvent *event) { QPushButton::mouseMoveEvent(event); float disX = event->x() - this ->startX; float disY = event->y() - this ->startY; this ->move( this ->x()+disX, this ->y()+disY); Window *parent = (Window*) this ->parent(); parent->changeSize(); } void PointButton::mouseReleaseEvent(QMouseEvent *event) { QPushButton::mouseReleaseEvent(event); this ->isPressed = false ; } |
window.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#ifndef WINDOW_H #define WINDOW_H #include <QWidget> #include <QPaintEvent> #include <QMouseEvent> #include <QPen> #include "point_button.h" class Window : public QWidget { Q_OBJECT public : Window(QWidget *parent = nullptr); ~Window(); void changeSize(); // 改变矩形尺寸 void hideCornerBtns(); // 隐藏边角拖曳按钮 void showCornerBtns(); // 设置边角拖曳按钮位置并显示 protected : void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void paintEvent(QPaintEvent *event); private : int x1; // x1和y1是矩形左上角坐标 int y1; int x2; // x2和y2是矩形右下角坐标 int y2; QPen pen; PointButton *topLeftBtn; PointButton *topRightBtn; PointButton *bottomLeftBtn; PointButton *bottomRightBtn; }; #endif // WINDOW_H |
window.cp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#include "window.h" #include <Qt> #include <QPainter> #include <QDebug> Window::Window(QWidget *parent): QWidget(parent) { this ->pen = QPen(Qt::black); this ->topLeftBtn = new PointButton( this ); this ->topRightBtn = new PointButton( this ); this ->bottomLeftBtn = new PointButton( this ); this ->bottomRightBtn = new PointButton( this ); this ->x1 = float (NULL); this ->y1 = float (NULL); this ->x2 = float (NULL); this ->y2 = float (NULL); this ->hideCornerBtns(); } Window::~Window() { } void Window::mousePressEvent(QMouseEvent *event) { QWidget::mousePressEvent(event); this ->x1 = float (NULL); this ->y1 = float (NULL); this ->x2 = float (NULL); this ->y2 = float (NULL); this ->hideCornerBtns(); this ->x1 = event->x(); this ->y1 = event->y(); this ->update(); } void Window::mouseMoveEvent(QMouseEvent *event) { QWidget::mouseMoveEvent(event); if ( this ->topLeftBtn->isPressed || this ->topRightBtn->isPressed || this ->bottomLeftBtn->isPressed || this ->bottomRightBtn->isPressed) return ; this ->x2 = event->x(); this ->y2 = event->y(); this ->update(); } void Window::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); if ( this ->x1== float (NULL) || this ->y1== float (NULL) || this ->x2== float (NULL) || this ->y2== float (NULL)) { return ; } QPainter painter( this ); painter.setPen( this ->pen); int width = this ->x2 - this ->x1; int height = this ->y2 - this ->y1; painter.drawRect( this ->x1, this ->y1, width, height); this ->showCornerBtns(); } void Window::hideCornerBtns() { this ->topLeftBtn->hide(); this ->topRightBtn->hide(); this ->bottomLeftBtn->hide(); this ->bottomRightBtn->hide(); } void Window::showCornerBtns() { int halfWidth = int ( this ->topLeftBtn->width() / 2); int halfHeight = int ( this ->topLeftBtn->height() / 2); this ->topLeftBtn->move( this ->x1-halfWidth, this ->y1-halfHeight); this ->topRightBtn->move( this ->x2-halfWidth, this ->y1-halfHeight); this ->bottomLeftBtn->move( this ->x1-halfWidth, this ->y2-halfHeight); this ->bottomRightBtn->move( this ->x2-halfWidth, this ->y2-halfHeight); this ->topLeftBtn->show(); this ->topRightBtn->show(); this ->bottomLeftBtn->show(); this ->bottomRightBtn->show(); } void Window::changeSize() { if ( this ->topLeftBtn->isPressed) { this ->x1 = int ( this ->topLeftBtn->x() + this ->topLeftBtn->width()/2); this ->y1 = int ( this ->topLeftBtn->y() + this ->topLeftBtn->height()/2); } else if ( this ->topRightBtn->isPressed) { this ->x2 = int ( this ->topRightBtn->x() + this ->topRightBtn->width()/2); this ->y1 = int ( this ->topRightBtn->y() + this ->topRightBtn->height()/2); } else if ( this ->bottomLeftBtn->isPressed) { this ->x1 = int ( this ->bottomLeftBtn->x() + this ->bottomLeftBtn->width()/2); this ->y2 = int ( this ->bottomLeftBtn->y() + this ->bottomLeftBtn->height()/2); } else if ( this ->bottomRightBtn->isPressed) { this ->x2 = int ( this ->bottomRightBtn->x() + this ->bottomRightBtn->width()/2); this ->y2 = int ( this ->bottomRightBtn->y() + this ->bottomRightBtn->height()/2); } this ->update(); } |
main.cpp
1
2
3
4
5
6
7
8
9
10
11
|
#include "window.h" #include <QApplication> int main( int argc, char *argv[]) { QApplication a(argc, argv); Window w; w.show(); return a.exec(); } |
以上就是Qt实现矩形大小任意缩放的示例代码的详细内容,更多关于Qt矩形任意缩放的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/La_vie_est_belle/article/details/125117484