事件
轶事
有人喜欢把这些东西翻译成信号和槽机制
执行情况
调用应用的exec_()方法时
,应用会进入主循环,主循环会监听和分发事件。
事件模型
事件源
就是发生了状态改变的对象。事件
是这个对象状态改变的内容。事件目标
是事件想作用的目标。
事件源绑定事件处理函数,然后作用于事件目标身上。
PyQt5中是怎么做的?
signal and slot机制。Signals and slots用于对象间的通讯
- 事件触发的时候,发生一个signal
slot
是用来被Python调用
的- slot只有在事件触发的时候才能调用
关键代码
sld = QSlider(Qt.Horizontal) # 生成滑块
lcd = QLCDNumber() # 生成QtLCD数字显示器
vbox = QVBoxLayout() # 设置垂直布局
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
sld.valueChanged.connect(lcd.display) # 设置signal和slot机制
要点解释
sld.valueChanged.connect(lcd.display) # 设置signal和slot机制
这里是把滑块的变化和数字的变化绑定在一起。
sender
是信号的发送者,receiver
是信号的接收者,slot
是对这个信号应该做出的反应。
完整代码
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QLCDNumber, QSlider\
, QVBoxLayout
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
sld = QSlider(Qt.Horizontal) # 生成滑块
lcd = QLCDNumber() # 生成QtLCD数字显示器
vbox = QVBoxLayout() # 设置垂直布局
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
sld.valueChanged.connect(lcd.display) # 设置signal和slot机制
self.setGeometry(650, 450, 450, 300)
self.setWindowTitle('Signal and Slot')
self.center()
self.show()
def center(self):
qr = self.frameGeometry()
qp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(qp)
self.move(qr.topLeft())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())