python3.6结合PYQT5学习笔记4--事件与信号处理(1)
GUI应用程序是事件驱动的。 事件主要由应用程序的用户生成。 但它们也可以通过其他手段产生,例如:网络连接,窗口管理器或定时器。 当我们调用应用程序的exec_()方法时,应用程序进入主循环。 主循环获取事件并将其发送到对象。
在事件模型中,有三个参与者:
- 事件来源
- 事件对象
- 事件目标
事件源是其状态更改的对象。 它会生成事件。 事件对象(event)将状态更改封装在事件源中。 事件目标是要通知的对象。 事件源对象将处理事件的任务委托给事件目标。
PyQt5具有独特的信号和插槽机制来处理事件。 信号和槽用于对象之间的通信。 发生特定事件时发出信号。 槽可以是任何Python可调用的函数。 当发射连接的信号时会调用一个槽。
一、简单的信号与槽示例
代码如下:
#coding=utf-8
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QDial, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
lcd = QLCDNumber(self)
dial = QDial(self)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('weilai_test6')
lcd.setGeometry(100,50,150,60)
dial.setGeometry(120,120,100,100)
dial.valueChanged.connect(lcd.display)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
在这个例子我们展示了一个QtGui.QLCDNumber和一个QtGui.QDial这个两个小部件,当我们拨动QDial这个小部件的时候,LCD屏幕就会显示出此时Dial小部件的值。
dial.valueChanged.connect(lcd.display)
二、QSlider
这里我们将QDial这个小部件的一个valueChanged信号连接到lcd数字的显示槽。
QDial对象发送信号。 QLCDNumber接收信号的。 槽是对信号作出反应的方法。
当然你把上面的QDial小部件换成QSlider,也是一样的效果,执行结果如下:
三、重新实现事件处理
下面这个例子,我们就重新实现了按下按钮后要如何处理。
#coding=utf-8
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QApplication, QLabel)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUi()
def initUi(self):
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('weilai_test8')
self.lab = QLabel('方向',self)
self.lab.setGeometry(150,100,50,50)
self.show()
def keyPressEvent(self, e):
if e.key() == Qt.Key_Up:
self.lab.setText('↑')
elif e.key() == Qt.Key_Down:
self.lab.setText('↓')
elif e.key() == Qt.Key_Left:
self.lab.setText('←')
else:
self.lab.setText('→')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
def keyPressEvent(self, e):
if e.key() == Qt.Key_Up:
self.lab.setText('↑')
elif e.key() == Qt.Key_Down:
self.lab.setText('↓')
elif e.key() == Qt.Key_Left:
self.lab.setText('←')
else:
self.lab.setText('→')
在我们的例子中,我们重新实现了keyPressEvent()事件处理程序。当我们按住上、下、左、右方向键的时候,窗口中依次会出现对应方位。