QWidget类中包含如下虚函数,提供对鼠标事件的处理:
xxxxxxxxxx
41virtual void mousePressEvent(QMouseEvent* e); // 鼠标键按下事件处理函数
2virtual void mouseReleaseEvent(QMouseEvent* e); // 鼠标键弹起事件处理函数
3virtual void mouseDoubleClickEvent(QMouseEvent* e); // 鼠标键双击事件处理函数
4virtual void mouseMoveEvent(QMouseEvent* e); // 鼠标移动事件处理函数
其参数QMouseEvent描述了事件发生时的细节,如具体哪个鼠标键按下、弹起或双击,鼠标所在位置,等等。
通过QtCreator,在C:\Users\Minwei\Projects\Qt路径下,创建名为Mouse的项目。
C:\Users\Minwei\Projects\Qt\Mouse\mousedialog.ui:
xxxxxxxxxx
4831
2<ui version="4.0">
3 <class>MouseDialog</class>
4 <widget class="QDialog" name="MouseDialog">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>400</width>
10 <height>300</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>鼠标</string>
15 </property>
16 <widget class="QLabel" name="m_block">
17 <property name="geometry">
18 <rect>
19 <x>175</x>
20 <y>125</y>
21 <width>50</width>
22 <height>50</height>
23 </rect>
24 </property>
25 <property name="palette">
26 <palette>
27 <active>
28 <colorrole role="WindowText">
29 <brush brushstyle="SolidPattern">
30 <color alpha="255">
31 <red>0</red>
32 <green>0</green>
33 <blue>0</blue>
34 </color>
35 </brush>
36 </colorrole>
37 <colorrole role="Button">
38 <brush brushstyle="SolidPattern">
39 <color alpha="255">
40 <red>255</red>
41 <green>170</green>
42 <blue>0</blue>
43 </color>
44 </brush>
45 </colorrole>
46 <colorrole role="Light">
47 <brush brushstyle="SolidPattern">
48 <color alpha="255">
49 <red>255</red>
50 <green>213</green>
51 <blue>127</blue>
52 </color>
53 </brush>
54 </colorrole>
55 <colorrole role="Midlight">
56 <brush brushstyle="SolidPattern">
57 <color alpha="255">
58 <red>255</red>
59 <green>191</green>
60 <blue>63</blue>
61 </color>
62 </brush>
63 </colorrole>
64 <colorrole role="Dark">
65 <brush brushstyle="SolidPattern">
66 <color alpha="255">
67 <red>127</red>
68 <green>85</green>
69 <blue>0</blue>
70 </color>
71 </brush>
72 </colorrole>
73 <colorrole role="Mid">
74 <brush brushstyle="SolidPattern">
75 <color alpha="255">
76 <red>170</red>
77 <green>113</green>
78 <blue>0</blue>
79 </color>
80 </brush>
81 </colorrole>
82 <colorrole role="Text">
83 <brush brushstyle="SolidPattern">
84 <color alpha="255">
85 <red>0</red>
86 <green>0</green>
87 <blue>0</blue>
88 </color>
89 </brush>
90 </colorrole>
91 <colorrole role="BrightText">
92 <brush brushstyle="SolidPattern">
93 <color alpha="255">
94 <red>255</red>
95 <green>255</green>
96 <blue>255</blue>
97 </color>
98 </brush>
99 </colorrole>
100 <colorrole role="ButtonText">
101 <brush brushstyle="SolidPattern">
102 <color alpha="255">
103 <red>0</red>
104 <green>0</green>
105 <blue>0</blue>
106 </color>
107 </brush>
108 </colorrole>
109 <colorrole role="Base">
110 <brush brushstyle="SolidPattern">
111 <color alpha="255">
112 <red>255</red>
113 <green>255</green>
114 <blue>255</blue>
115 </color>
116 </brush>
117 </colorrole>
118 <colorrole role="Window">
119 <brush brushstyle="SolidPattern">
120 <color alpha="255">
121 <red>255</red>
122 <green>170</green>
123 <blue>0</blue>
124 </color>
125 </brush>
126 </colorrole>
127 <colorrole role="Shadow">
128 <brush brushstyle="SolidPattern">
129 <color alpha="255">
130 <red>0</red>
131 <green>0</green>
132 <blue>0</blue>
133 </color>
134 </brush>
135 </colorrole>
136 <colorrole role="AlternateBase">
137 <brush brushstyle="SolidPattern">
138 <color alpha="255">
139 <red>255</red>
140 <green>212</green>
141 <blue>127</blue>
142 </color>
143 </brush>
144 </colorrole>
145 <colorrole role="ToolTipBase">
146 <brush brushstyle="SolidPattern">
147 <color alpha="255">
148 <red>255</red>
149 <green>255</green>
150 <blue>220</blue>
151 </color>
152 </brush>
153 </colorrole>
154 <colorrole role="ToolTipText">
155 <brush brushstyle="SolidPattern">
156 <color alpha="255">
157 <red>0</red>
158 <green>0</green>
159 <blue>0</blue>
160 </color>
161 </brush>
162 </colorrole>
163 <colorrole role="PlaceholderText">
164 <brush brushstyle="SolidPattern">
165 <color alpha="128">
166 <red>0</red>
167 <green>0</green>
168 <blue>0</blue>
169 </color>
170 </brush>
171 </colorrole>
172 </active>
173 <inactive>
174 <colorrole role="WindowText">
175 <brush brushstyle="SolidPattern">
176 <color alpha="255">
177 <red>0</red>
178 <green>0</green>
179 <blue>0</blue>
180 </color>
181 </brush>
182 </colorrole>
183 <colorrole role="Button">
184 <brush brushstyle="SolidPattern">
185 <color alpha="255">
186 <red>255</red>
187 <green>170</green>
188 <blue>0</blue>
189 </color>
190 </brush>
191 </colorrole>
192 <colorrole role="Light">
193 <brush brushstyle="SolidPattern">
194 <color alpha="255">
195 <red>255</red>
196 <green>213</green>
197 <blue>127</blue>
198 </color>
199 </brush>
200 </colorrole>
201 <colorrole role="Midlight">
202 <brush brushstyle="SolidPattern">
203 <color alpha="255">
204 <red>255</red>
205 <green>191</green>
206 <blue>63</blue>
207 </color>
208 </brush>
209 </colorrole>
210 <colorrole role="Dark">
211 <brush brushstyle="SolidPattern">
212 <color alpha="255">
213 <red>127</red>
214 <green>85</green>
215 <blue>0</blue>
216 </color>
217 </brush>
218 </colorrole>
219 <colorrole role="Mid">
220 <brush brushstyle="SolidPattern">
221 <color alpha="255">
222 <red>170</red>
223 <green>113</green>
224 <blue>0</blue>
225 </color>
226 </brush>
227 </colorrole>
228 <colorrole role="Text">
229 <brush brushstyle="SolidPattern">
230 <color alpha="255">
231 <red>0</red>
232 <green>0</green>
233 <blue>0</blue>
234 </color>
235 </brush>
236 </colorrole>
237 <colorrole role="BrightText">
238 <brush brushstyle="SolidPattern">
239 <color alpha="255">
240 <red>255</red>
241 <green>255</green>
242 <blue>255</blue>
243 </color>
244 </brush>
245 </colorrole>
246 <colorrole role="ButtonText">
247 <brush brushstyle="SolidPattern">
248 <color alpha="255">
249 <red>0</red>
250 <green>0</green>
251 <blue>0</blue>
252 </color>
253 </brush>
254 </colorrole>
255 <colorrole role="Base">
256 <brush brushstyle="SolidPattern">
257 <color alpha="255">
258 <red>255</red>
259 <green>255</green>
260 <blue>255</blue>
261 </color>
262 </brush>
263 </colorrole>
264 <colorrole role="Window">
265 <brush brushstyle="SolidPattern">
266 <color alpha="255">
267 <red>255</red>
268 <green>170</green>
269 <blue>0</blue>
270 </color>
271 </brush>
272 </colorrole>
273 <colorrole role="Shadow">
274 <brush brushstyle="SolidPattern">
275 <color alpha="255">
276 <red>0</red>
277 <green>0</green>
278 <blue>0</blue>
279 </color>
280 </brush>
281 </colorrole>
282 <colorrole role="AlternateBase">
283 <brush brushstyle="SolidPattern">
284 <color alpha="255">
285 <red>255</red>
286 <green>212</green>
287 <blue>127</blue>
288 </color>
289 </brush>
290 </colorrole>
291 <colorrole role="ToolTipBase">
292 <brush brushstyle="SolidPattern">
293 <color alpha="255">
294 <red>255</red>
295 <green>255</green>
296 <blue>220</blue>
297 </color>
298 </brush>
299 </colorrole>
300 <colorrole role="ToolTipText">
301 <brush brushstyle="SolidPattern">
302 <color alpha="255">
303 <red>0</red>
304 <green>0</green>
305 <blue>0</blue>
306 </color>
307 </brush>
308 </colorrole>
309 <colorrole role="PlaceholderText">
310 <brush brushstyle="SolidPattern">
311 <color alpha="128">
312 <red>0</red>
313 <green>0</green>
314 <blue>0</blue>
315 </color>
316 </brush>
317 </colorrole>
318 </inactive>
319 <disabled>
320 <colorrole role="WindowText">
321 <brush brushstyle="SolidPattern">
322 <color alpha="255">
323 <red>127</red>
324 <green>85</green>
325 <blue>0</blue>
326 </color>
327 </brush>
328 </colorrole>
329 <colorrole role="Button">
330 <brush brushstyle="SolidPattern">
331 <color alpha="255">
332 <red>255</red>
333 <green>170</green>
334 <blue>0</blue>
335 </color>
336 </brush>
337 </colorrole>
338 <colorrole role="Light">
339 <brush brushstyle="SolidPattern">
340 <color alpha="255">
341 <red>255</red>
342 <green>213</green>
343 <blue>127</blue>
344 </color>
345 </brush>
346 </colorrole>
347 <colorrole role="Midlight">
348 <brush brushstyle="SolidPattern">
349 <color alpha="255">
350 <red>255</red>
351 <green>191</green>
352 <blue>63</blue>
353 </color>
354 </brush>
355 </colorrole>
356 <colorrole role="Dark">
357 <brush brushstyle="SolidPattern">
358 <color alpha="255">
359 <red>127</red>
360 <green>85</green>
361 <blue>0</blue>
362 </color>
363 </brush>
364 </colorrole>
365 <colorrole role="Mid">
366 <brush brushstyle="SolidPattern">
367 <color alpha="255">
368 <red>170</red>
369 <green>113</green>
370 <blue>0</blue>
371 </color>
372 </brush>
373 </colorrole>
374 <colorrole role="Text">
375 <brush brushstyle="SolidPattern">
376 <color alpha="255">
377 <red>127</red>
378 <green>85</green>
379 <blue>0</blue>
380 </color>
381 </brush>
382 </colorrole>
383 <colorrole role="BrightText">
384 <brush brushstyle="SolidPattern">
385 <color alpha="255">
386 <red>255</red>
387 <green>255</green>
388 <blue>255</blue>
389 </color>
390 </brush>
391 </colorrole>
392 <colorrole role="ButtonText">
393 <brush brushstyle="SolidPattern">
394 <color alpha="255">
395 <red>127</red>
396 <green>85</green>
397 <blue>0</blue>
398 </color>
399 </brush>
400 </colorrole>
401 <colorrole role="Base">
402 <brush brushstyle="SolidPattern">
403 <color alpha="255">
404 <red>255</red>
405 <green>170</green>
406 <blue>0</blue>
407 </color>
408 </brush>
409 </colorrole>
410 <colorrole role="Window">
411 <brush brushstyle="SolidPattern">
412 <color alpha="255">
413 <red>255</red>
414 <green>170</green>
415 <blue>0</blue>
416 </color>
417 </brush>
418 </colorrole>
419 <colorrole role="Shadow">
420 <brush brushstyle="SolidPattern">
421 <color alpha="255">
422 <red>0</red>
423 <green>0</green>
424 <blue>0</blue>
425 </color>
426 </brush>
427 </colorrole>
428 <colorrole role="AlternateBase">
429 <brush brushstyle="SolidPattern">
430 <color alpha="255">
431 <red>255</red>
432 <green>170</green>
433 <blue>0</blue>
434 </color>
435 </brush>
436 </colorrole>
437 <colorrole role="ToolTipBase">
438 <brush brushstyle="SolidPattern">
439 <color alpha="255">
440 <red>255</red>
441 <green>255</green>
442 <blue>220</blue>
443 </color>
444 </brush>
445 </colorrole>
446 <colorrole role="ToolTipText">
447 <brush brushstyle="SolidPattern">
448 <color alpha="255">
449 <red>0</red>
450 <green>0</green>
451 <blue>0</blue>
452 </color>
453 </brush>
454 </colorrole>
455 <colorrole role="PlaceholderText">
456 <brush brushstyle="SolidPattern">
457 <color alpha="128">
458 <red>0</red>
459 <green>0</green>
460 <blue>0</blue>
461 </color>
462 </brush>
463 </colorrole>
464 </disabled>
465 </palette>
466 </property>
467 <property name="autoFillBackground">
468 <bool>true</bool>
469 </property>
470 <property name="frameShape">
471 <enum>QFrame::WinPanel</enum>
472 </property>
473 <property name="frameShadow">
474 <enum>QFrame::Raised</enum>
475 </property>
476 <property name="text">
477 <string/>
478 </property>
479 </widget>
480 </widget>
481 <resources/>
482 <connections/>
483</ui>
C:\Users\Minwei\Projects\Qt\Mouse\mousedialog.h:
xxxxxxxxxx
291
2
3
4
5
6QT_BEGIN_NAMESPACE
7namespace Ui { class MouseDialog; }
8QT_END_NAMESPACE
9
10class MouseDialog : public QDialog
11{
12 Q_OBJECT
13
14public:
15 MouseDialog(QWidget *parent = nullptr);
16 ~MouseDialog();
17
18protected:
19 void mousePressEvent(QMouseEvent* e);
20 void mouseReleaseEvent(QMouseEvent* e);
21 void mouseMoveEvent(QMouseEvent* e);
22
23private:
24 Ui::MouseDialog *ui;
25 bool m_dragging;
26 QPoint m_offset;
27};
28
29// MOUSEDIALOG_H
C:\Users\Minwei\Projects\Qt\Mouse\mousedialog.cpp:
xxxxxxxxxx
601
2using namespace std;
3
4
5
6
7
8
9MouseDialog::MouseDialog(QWidget *parent)
10 : QDialog(parent)
11 , ui(new Ui::MouseDialog)
12 , m_dragging(false)
13{
14 ui->setupUi(this);
15}
16
17MouseDialog::~MouseDialog()
18{
19 delete ui;
20}
21
22void MouseDialog::mousePressEvent(QMouseEvent* e)
23{
24 if (e->button() == Qt::LeftButton)
25 {
26 QRect blockRect = ui->m_block->frameRect();
27 blockRect.translate(ui->m_block->pos());
28
29 if (blockRect.contains(e->pos()))
30 {
31 m_dragging = true;
32 m_offset = ui->m_block->pos() - e->pos();
33 }
34 }
35}
36
37void MouseDialog::mouseReleaseEvent(QMouseEvent* e)
38{
39 if (e->button() == Qt::LeftButton)
40 m_dragging = false;
41}
42
43void MouseDialog::mouseMoveEvent(QMouseEvent* e)
44{
45 if (m_dragging)
46 {
47 QPoint blockPos = e->pos() + m_offset;
48
49 QSize windowSize = size();
50 QSize blockSize = ui->m_block->size();
51
52 int xMin = 0, xMax = windowSize.width() - blockSize.width();
53 int yMin = 0, yMax = windowSize.height() - blockSize.height();
54
55 blockPos.setX(min(max(blockPos.x(), xMin), xMax));
56 blockPos.setY(min(max(blockPos.y(), yMin), yMax));
57
58 ui->m_block->move(blockPos);
59 }
60}
运行效果如图所示: