首页 > 技术文章 > 通过setMouseTracking实现用鼠标拖动控件

nomorebug 2021-02-07 13:12 原文

 1 import  sys
 2 from PyQt5.Qt import *
 3 
 4 class Mwindow(QWidget):
 5     leftclick = False
 6 
 7     def __init__(self):
 8         super().__init__()
 9         self.resize(500,500)
10         self.move(250,150)
11         self.setup_Ui()
12 
13     def setup_Ui(self):
14         # self.btn = QPushButton(self)
15         # self.btn.setText("点击我")
16         # self.btn.move(230,150)
17         pass
18 
19     # def mousePressEvent(self, evt) :                        (在窗口中直接拖动)                
20     #
21     #     if evt.button() == Qt.LeftButton:
22     #         self.leftclick = True
23     #         self.mouse_x = evt.globalX()
24     #         self.mouse_y = evt.globalY()
25     #         self.btn_x = self.btn.x()
26     #         self.btn_y = self.btn.y()
27     #
28     #
29     # def mouseMoveEvent(self, evt):
30     #     if self.leftclick == True:
31     #         move_x = evt.globalX()-self.mouse_x
32     #         move_y = evt.globalY()-self.mouse_y
33     #         self.btn.move(self.btn_x+move_x,self.btn_y+move_y)
34     #
35     # def mouseReleaseEvent(self, evt3) :
36     #     self.leftclick = False
37 
38 class Mypussbutton(QPushButton):
39     longclick = False
40 
41     def mousePressEvent(self, evt):
42         if evt.button() == Qt.LeftButton:
43             self.longclick = True
44             self.mouse_x = evt.globalX()
45             self.mouse_y = evt.globalY()
46             self.btn_x = self.x()
47             self.btn_y = self.y()
48 
49     def mouseMoveEvent(self, evt):
50         if self.longclick == True:
51             move_x = evt.globalX() - self.mouse_x
52             move_y = evt.globalY() - self.mouse_y
53             self.move(self.btn_x+move_x,self.btn_y+move_y)
54             print(self.btn_x + move_x, self.btn_y + move_y)
55     def mouseReleaseEvent(self, evt):
56         self.longclick = False
57 
58 
59 if __name__ == '__main__':
60     app = QApplication(sys.argv)
61     win = Mwindow()
62     # win.setMouseTracking(True)
63     btn = Mypussbutton(win)
64     btn.setText("点击我")
65     btn.move(250,150)
66     btn.setMouseTracking(True)
67     win.show()
68     sys.exit(app.exec_())

   

  mousePressEvent 中一定要有一个判定变量,避免鼠标移入控件时,PressEvent中对应变量没有赋值导致程序崩溃。

 

推荐阅读