PyQt5 - 信号与插槽

与以顺序方式执行的控制台模式应用程序不同,基于 GUI 的应用程序是事件驱动的。 函数或方法响应用户的操作(例如单击按钮、从集合中选择项目或单击鼠标等)执行,称为 events

用于构建 GUI 界面的小部件充当此类事件的来源。 每个派生自 QObject 类的 PyQt 小部件都旨在发出 "信号" 以响应一个或多个事件。信号本身不执行任何操作。 相反,它"连接"到一个"插槽"。 插槽可以是任何可调用的 Python 函数


使用 Qt Designer 的 Signal/Slot 编辑器

首先设计一个带有 LineEdit 控件和 PushButton 的简单表单。

Slot 编辑器

希望如果按下按钮,文本框的内容应该被删除。 QLineEdit 小部件为此目的有一个 clear() 方法。 因此,按钮的 clicked 信号将连接到文本框的 clear() 方法。

首先,从 Edit 菜单中选择 Edit signals/slots(或按 F4)。 然后用鼠标突出显示按钮并将光标拖向文本框

Cursor

释放鼠标时,将显示一个对话框,显示按钮 Signal 和 Slot 方法。 选择 clicked 信号和 clear() 方法

Clear Method

右下角的 Signal/Slot 编辑器窗口将显示结果 −

Editor Window

从 ui 文件中保存 ui 和 Build 和 Python 代码,如下面的代码所示 −

pyuic5 -x signalslot.ui -o signalslot.py

生成的 Python 代码将通过以下语句在信号和插槽之间建立联系 −

self.pushButton.clicked.connect(self.lineEdit.clear)

运行 signalslot.py 并在 LineEdit 中输入一些文本。 如果按下按钮,文本将被清除。


建立 Signal-slot 连接

您可以不使用Designer,而是通过以下语法直接建立 Signal-slot 连接 −

widget.signal.connect(slot_function)

假设单击按钮时是否要调用函数。 在这里,clicked 信号将连接到一个可调用函数。 它可以通过以下任何一种技术来实现 −

button.clicked.connect(slot_function)

示例

在以下示例中,在 QDialog 窗口中添加了两个 QPushButton 对象(b1 和 b2)。 我们想分别在单击 b1 和 b2 时调用函数 b1_clicked() 和 b2_clicked()。

当b1被点击时,clicked()信号连接到b1_clicked()函数 −

b1.clicked.connect(b1_clicked())

单击 b2 时,clicked() 信号连接到 b2_clicked() 函数。

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)
   
   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print ("Button 1 clicked")

def b2_clicked():
   print ("Button 2 clicked")

if __name__ == '__main__':
   window()

上面的代码产生以下输出 −

PushButton

Output

Button 1 clicked
Button 2 clicked