什么是信号和槽
信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。在QT中,每个继承自QObject的对象都可以使用信号和槽机制来进行通信。 信号和槽函数通过object.signal.connect()方法来连接。当一个QObject对象发射信号,与之相连接的槽函数将会自动执行。
假设我们将每个继承自QObject的对象想象成现实系统中可以完成一种或多种功能的部件,信号相当于发射,槽相当于接收。当某个部件完成某个功能后,可以发送一个信号,表示我已经完成了某项工作(同时可以传递一些结果数据, 非必须),这时候,那些和该信号连接的部件,相当于接收到该信号,对应的槽函数完成相应的工作。
信号和槽机制是类型安全的(type-safe):一个信号的参数必须和接收槽的参数匹配,(槽的参数可以比它接收的信号的参数短)。信号与槽是松耦合(loosely coupled)的:一个发出信号的类既不知道也不关心哪一个槽接收到这个信号。Qt的信号和槽机制保证了如果你将一个信号连接到一个槽上,槽会在正确的时间以信号的参数被调用。信号与槽可以携带任意个、任意类型的参数。
PyQt的对象都包含各自的内置信号,也可以添加自定义信号,信号与槽的特点大致如下:
- 一个信号可以连接多个槽;
- 一个信号可以连接另一个信号;
- 信号参数可以是Python基本数据类型,也可以扩展新的数据类型;
- 多个信号可以连接在一个槽上,即一个槽可以监听多个信号;
- 信号与槽的连接方式可以是同步连接,也可以是异步连接;
- 信号与槽可能会在不同的线程间连接,这时信号连接只能是异步方式;
- 信号不是必须有槽和其连接,即信号可以不处理;
- 信号个槽的连接可以被断开。
信号和槽的使用方法演示
在PyQt中,当object发出信号时,使用信号(signal)直接连接槽函数(slot_function), 连接方式如下:
object.signal.connect(slot_function);
下面的代码使用一个按钮,演示了信号和槽的连接方式:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox
class testWindow(QMainWindow):
def __init__(self, parent=None):
super(testWindow, self).__init__(parent)
button = QPushButton("按钮", self)
button.move(100, 100)
button.clicked.connect(self.buttonClicked)
self.setGeometry(100, 100, 320, 240)
self.setWindowTitle("Test Signal Slot connect")
def buttonClicked(self):
QMessageBox.information(self, "提示信息", "信号和槽测试:点击了按钮")
if __name__ == '__main__':
app = QApplication(sys.argv)
wnd = testWindow()
wnd.show()
sys.exit(app.exec())
运行上述代码,结果如下图所示
本文知识点
- 什么是信号和槽;
- 信号和槽的连接方式;
- 使用QWidget对象QPushButton。
喜欢本文内容的就收藏,点赞,评论,关注和转发。