- 重新实现事件处理器
- 信号发出
主要内容 #
完成效果 #
完成本节课程,能学会在窗口应用程序上进行事件和信号槽的处理。
效果如下:
收获 #
学习完本节内容,我们会知道如何重新实现事件处理器,以及自定义信号并发送信号。
1.重新实现事件处理器 #
在PyQt5中,事件处理器经常被重写(也就是用自己的覆盖库自带的)。
通过重载实现特定的函数,可以在事件到达特定的事件处理器之前截获并处理。
比如,通过重载keyPressEvent () 函数,可处理击键事件,以下是重新实现事件处理器示例:
import sys from PyQt5.QtCore import Qt, pyqtSignal from PyQt5.QtWidgets import QWidget, QApplication, QLineEdit class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle('Event handler') self.show() def keyPressEvent(self, e): # 重新实现了事件处理器函数keyPressEvent() # 如果按下ESC键程序就会退出 if e.key() == Qt.Key_Escape: self.close() app = QApplication(sys.argv) # 创建应用程序 ex = Example() # 创建窗口对象 sys.exit(app.exec_()) # 设置关闭窗口后结束进程
拓展练习:运行上述代码,并按键盘上的ESC键,然后再次运行,按键盘其他键,比较有何不同。
2.信号发出 #
PyQt5 的默认的信号不能满足于开发复杂的界面程序,我们经常需要创建自己的信号,然后发送该信号。
PyQt5 提供了一个 pyqtSignal 对象,使用该对象我们可以自己发送信号,以下为使用示例:
我们定义一个信号对象 sinOut,然后给该信号关联一个槽函数 self.outText。
在界面启动后,用 emit 函数进行了信号发送,在发送信号的同时,还传了一个参数 “dashima”。
最后在消息处理函数 outText 中,该参数被显示在了编辑框中。
class Example(QWidget): sinOut = pyqtSignal(str) # 定义带一个str类型参数的信号 def __init__(self): super().__init__() self.initUI() def initUI(self): self.edit = QLineEdit("输入框", self) # 定义一个编辑框控件 self.edit.move(100, 100) # 移动编辑框到窗口坐标(100, 100) self.sinOut.connect(self.outText) # 关联槽函数 outText self.sinOut.emit("dashima") # 往消息队列里面投递消息(发信号),目的是把内容发送给槽函数 self.setGeometry(200, 200, 500, 500) self.setWindowTitle('SignalExample2') self.show() def outText(self, text): # 槽函数 self.edit.setText(text) # 让编辑框显示sinOut发送的信号内容
将上述代码替换第一节代码框架中的class Example即可。
拓展练习:尝试更改sinOut发出的消息内容。
小结 #
习题 #
- 习题1:尝试将keyPressEvent()函数中Qt.Key_Escape改为Qt.Key_Backspace,运行程序然后按Backspace键。
- 习题2:尝试使用sinOut=pyqtSignal(int)创建int类型参数的信号,并在self.sinOut.emit()中输入整数,运行程序。