Signals & Slots及Events
Qt GUI 应用程序是事件驱动的。 事件主要由应用程序的用户生成。 但它们也可以通过其他方式生成; 例如 Internet 连接、窗口管理器或计时器。 当调用应用程序的 exec
或exec_
方法时,应用程序进入主循环。 主循环获取事件并将它们发送给对象。
在事件模型中,有三个参与者:
- 事件源
- 事件对象
- 事件目标
事件源是状态发生变化的对象。 它生成事件。 事件对象(event)封装了事件源中的状态变化。 事件目标是想要被通知的对象。 事件源对象将处理事件的任务委托给事件目标。
PyQt5 有一个独特的信号和槽机制来处理事件。 信号和槽用于对象之间的通信。 当特定事件发生时会发出信号。 插槽可以是任何 Python 可调用的。 发出连接信号时调用插槽。
在文中,将详细介绍PyQt的Singal、Slote和Event。
1、Signals & Slots
Signal(信号)
是Qt小部件在发生某些事情时发出的通知。例如,从按下按钮,到输入框的文本发生变化,再到窗口的文本发生变化。 许多信号是由用户操作发起的,但也可以是其他方式,例如Internet连接、窗口管理器或计数器。
除了通知发生的事情外,信号还可以发送数据以提供有关发生情况的额外上下文。
在Qt中,除了小部件自带的信号之外,还支持自定义信号,这将在后面详细介绍。
Slots
是 Qt 用于信号接收器的名称。 在 Python 中,应用程序中的任何函数(或方法)都可以用作Slot——只需将信号连接到它即可。 如果信号发送数据,那么接收函数也将接收该数据。 许多 Qt 小部件也有自己的内置插槽,这意味着可以直接将 Qt 小部件连接在一起。
让我们看一下 Qt 信号的基础知识,以及如何使用它们来连接小部件以使事情发生在应用程序中。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("PyQt5")
# 创建QPushButton
button = QPushButton("Click Me!")
button.setCheckable(True)
# 连接clicked事件
button.clicked.connect(self.the_button_was_clicked)
self.setCentralWidget(button)
def the_button_was_clicked(self):
print("Clicked!")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
运行代码,当点击QPushButton时,控制台将输出如下消息:
Clicked!
Clicked!
Clicked!
Clicked!
1.1 接收数据
信号支持发送数据,在前面的例子中,我们设置QPushButton的checkable
属性设置为True
,这意味着,在clicked
信号触发时,会发送QPushbutton的checkable
值。为了接收该状态值,需要重新连接clicked
信号:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("PyQt5")
# 创建QPushButton
button = QPushButton("Click Me!")
# 设置可以点击
button.setCheckable(True)
# 连接clicked事件
button.clicked.connect(self.the_button_was_clicked)
button.clicked.connect(self.the_button_was_toggled)
self.setCentralWidget(button)
def the_button_was_clicked(self):
print("Clicked!")
def the_button_was_toggled(self, checked):
print("Checked?", checked)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
运行代码,点击QPushButton将得到如下结果:
Clicked!
Checked? True
Clicked!
Checked? False
1.2 数据储存
将小部件的当前状态存储在 Python 变量中通常很有用。 可