今天实现一个鼠标点击事件,效果如下图所示。
要实现这个功能,前提要先熟悉以下什么是事件。
1 事件
在PyQt6的GUI编程中,基于QWidget的应用程序都是由事件event驱动的,它的每个动作都会触发事件。例如单击命令按钮,系统就会产生一个鼠标点击事件,在文本框中输入内容就会产生鼠标事件,最小化窗口等会产生相应的事件等。
1.1 系统事件类型
事件 | 描述 |
---|---|
键盘事件 | 按键按下松开、焦点移动、获取焦点和失去焦点等触发的事件 |
鼠标事件 | 鼠标按下松开、移动点击双击、进入离开等都会触发的事件 |
窗口事件 | Widget的位置改变、大小改变、显示隐藏关闭等事件 |
绘制屏幕图形 | 窗口绘制和重绘动作 |
定时事件 | 定时器到时间触发事件 |
此外还有Socket事件、剪切板事件、字体改变事件、布局改变事件等(很多)
1.2 默认事件处理函数
PyQt6中,事件是一种对象,事件的基类是抽象类QEvent。QEvent有众多子类表示具体的事件,例如QKeyEvent表示键盘事件,QMouseEvent表示鼠标事件。
QEvent类定义了下列接口函数:
- accept():接收此事件,被接收的事件不会再继续上传至上层容器控件。
- ignore():忽略此事件,被忽略的事件会继续上传至上层容器控件。
- type():返回事件的类型。事件类型是枚举,例如QMouseEvent的type枚举值为5。
2.案例实现
2.1 创建event事件文件
创建event事件文件并命名为“事件处理.py”,编写如下代码:
# 自定义一个标签类
class myLabel(QtWidgets.QLabel):
def __init__(self, parent=None):
super(myLabel,self).__init__(parent)
font = QFont("楷体",16)
self.setFont(font)
# 重载鼠标按下事件
def mousePressEvent(self, event):
if event.buttons() == Qt.MouseButton.LeftButton:
self.setText("单机鼠标左键")
elif event.buttons() == Qt.MouseButton.RightButton:
self.setText("单击鼠标右键")
elif event.buttons() == Qt.MouseButton.MiddleButton:
self.setText("单机鼠标中键")
elif event.buttons() ==Qt.MouseButton.LeftButton|Qt.MouseButton.RightButton:
self.setText("同时单击鼠标左右键")
# 重载鼠标滚轮事件
def wheelEvent(self, event):
angle = event.angleDelta() / 8
angleX = angle.x()
angleY = angleX.y()
if angleY > 0:
self.setText("滚轮向上滚动")
print("鼠标滚轮上滚",angleY)
else:
self.setText("滚轮向下滚动")
print("鼠标滚轮下滚", angleX)
# 鼠标双击事件
def mouseDoubleClickEvent(self, event):
print("鼠标双击")
# 释放鼠标事件
def mouseReleaseEvent(self,event):
self.setText("鼠标按键释放")
上述代码中包含鼠标的按下、滚动、双击以及释放鼠标的事件,这些事件已经包含在myLabel类里面了,只要我们创建myLabel类,这些方法就可以使用。
2.2 创建面板并实现鼠标事件
# 自定义主窗口
class myWidget(QtWidgets.QWidget):
def __init__(self):
super(myWidget, self).__init__()
self.setWindowTitle("事件测试")
self.resize(350,250)
self.lb = myLabel(self)
self.lb.setText("----请点击-------")
self.lb.setGeometry(60,40,220,50)
def mouseMoveEvent(self, event):
print("鼠标移动", self.x(), self.y())
def resizeEvent(self,event):
message = "窗口大小调整为:QSize({0},{1})".format(event.size().width(),event.size().height())
print(message)
def keyPressEvent(self, event):
print("key")
if event.key() == Qt.Key.Key_Escape:
self.close()
def event(self,event):
if(event.type()== QEvent.Type.KeyPress and event.key() == Qt.Key.Key_Q):
print("A Key")
self.close()
return True
return QWidget.event(self, event)
代码中的 self.lb = myLabel(self) 就是我们调研myLabel的方法。
2.3 创建main方法,实现可视化
if __name__ =="__main__":
app = QtWidgets.QApplication(sys.argv)
w = myWidget()
w.show()
sys.exit(app.exec())
接下来就可以尝试点击鼠标,查看效果了,注意看输出的日志!
下一篇:PyQt6 对话框