事件,就是程序在运行中发生的事儿,桌面应用软件都是事件驱动的。事件可以是用户的操作,如鼠标点击或按键按下,也可以由系统产生,如定时关机。事件会触发相应的行为,即事件函数。
在事件模型中,有三个角色,分别是事件源、事件和事件目标。事件源就是发生了状态改变的对象,事件是这个对象状态的改变撞他改变的内容,事件目标是事件想作用的目标。事件源绑定事件处理函数,然后作用于事件目标身上。
事件源是状态发生变化的对象。它会生成事件。事件(对象)封装了事件源中状态的变动。事件接收者是要通知的对象。事件源对象将事件处理的工作交给事件接收者。
控件事件
在PyQt5中实现事件功能,有3个步骤,分别是:定义事件处理函数、选择事件类型、用connect(slot)方法进行绑定。有交互功能的控件,如按钮QPushButton、复选框QCheckBox和下拉列表QComboBox等,都有connect(slot)方法。slot参数为事件处理函数名称。
按钮选择了单击clicked事件类型之后,用connect(slot)方法绑定事件处理函数。不同类型的控件绑定相同的处理函数时,可先用控件的setProperty(name, any)方法,定义相同属性名称和不同值,其中name字符串,any为任何数据类型。
sender()方法会返回一个QObject对象,它为窗口事件的父类,通过property(name)方法获取属性值。根据不同的属性值执行不同的操作。QColorDialog.getColor()会弹出颜色对话框,
QFontDialog.getFont()弹出字体对话框。
程序清单:control_connect.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget,
QPushButton, QColorDialog, QFontDialog
# 继承QWidget
class ControlEvent(QWidget):
ID_COLOR = 1000
ID_FONT = 1001
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# 创建一个关闭按钮
close_btn = QPushButton(self)
close_btn.setText("关闭窗口")
close_btn.move(20, 20)
# 选择事件类型,绑定关闭方法
close_btn.clicked.connect(self.close_win)
# 点击按钮弹出颜色对话框
color_btn = QPushButton(self)
color_btn.setProperty("id", self.ID_COLOR)
color_btn.setText("颜色对话框")
color_btn.move(20, 60)
# 点击按钮弹出字体对话框
font_btn = QPushButton(self)
font_btn.setProperty("id", self.ID_FONT)
font_btn.setText("字体对话框")
font_btn.move(20, 100)
# 绑定同一个函数
color_btn.clicked.connect(self.open_dialog)
font_btn.clicked.connect(self.open_dialog)
# 调整窗口大小
self.resize(900, 500)
# 窗口居中
self.center()
# 窗口标题
self.setWindowTitle("控件事件")
# 显示窗口
self.show()
# 打开对话框
def open_dialog(self):
sender = self.sender()
if sender.property("id") == self.ID_COLOR:
col = QColorDialog.getColor()
if col.isValid():
print("选择的颜色为:%s" % col.name())
else:
font, ok = QFontDialog.getFont()
if ok:
print("选择的字体为:%s" % font.family())
# 关闭窗口
def close_win(self):
self.close()
# 实现居中
def center(self):
f = self.frameGeometry()
c = QDesktopWidget().availableGeometry().center()
f.moveCenter(c)
self.move(f.topLeft())
if __name__ == "__main__":
app = QApplication(sys.argv)
w = ControlEvent()
sys.exit(app.exec_())
运行程序之后,弹出的窗口如下:
好了,控件事件的内容就说到这了,关注我,下一节更精彩。
码字不易,你的关注和转发是对我最大的鼓励,谢谢!
一个当了10年技术总监的老家伙,分享多年的编程经验。想学编程的朋友,关注我,你就赚到了。我正在分享Python、前端、Java和App方面的干货了。赶紧来围观啊!!!