- PyQt5 教程
- PyQt5 - 首页
- PyQt5 - 简介
- PyQt5 - 最新动态
- PyQt5 - Hello World
- PyQt5 - 主要类
- PyQt5 - 使用 Qt Designer
- PyQt5 - 信号与槽
- PyQt5 - 布局管理
- PyQt5 - 基本控件
- PyQt5 - QDialog 类
- PyQt5 - QMessageBox
- PyQt5 - 多文档界面
- PyQt5 - 拖放
- PyQt5 - 数据库处理
- PyQt5 - 绘图 API
- PyQt5 - BrushStyle 常量
- PyQt5 - QClipboard
- PyQt5 - QPixmap 类
- PyQt5 有用资源
- PyQt5 - 快速指南
- PyQt5 - 有用资源
- PyQt5 - 讨论
PyQt5 - 信号与槽
与以顺序方式执行的控制台模式应用程序不同,基于 GUI 的应用程序是事件驱动的。函数或方法是响应用户操作(例如单击按钮、从集合中选择项目或鼠标单击等,称为事件)而执行的。
用于构建 GUI 界面的控件充当此类事件的来源。每个从 QObject 类派生的 PyQt 控件都设计为响应一个或多个事件发出“信号”。信号本身不执行任何操作。相反,它连接到一个“槽”。槽可以是任何可调用的 Python 函数。
使用 Qt Designer 的信号/槽编辑器
首先设计一个带有 LineEdit 控件和 PushButton 的简单表单。
如果按下按钮,则需要清除文本框的内容。QLineEdit 控件为此目的具有 clear() 方法。因此,按钮的clicked 信号需要连接到文本框的clear() 方法。
首先,从“编辑”菜单中选择“编辑信号/槽”(或按 F4)。然后用鼠标突出显示按钮并将光标拖动到文本框。
释放鼠标后,将显示一个对话框,其中显示按钮的信号和槽的方法。选择 clicked 信号和 clear() 方法。
右下角的信号/槽编辑器窗口将显示结果:
保存 ui 文件并根据以下代码从 ui 文件构建和生成 Python 代码:
pyuic5 -x signalslot.ui -o signalslot.py
生成的 Python 代码将通过以下语句建立信号和槽之间的连接:
self.pushButton.clicked.connect(self.lineEdit.clear)
运行 signalslot.py 并在 LineEdit 中输入一些文本。如果按下按钮,文本将被清除。
构建信号-槽连接
无需使用 Designer,您可以直接使用以下语法建立信号-槽连接:
widget.signal.connect(slot_function)
假设在单击按钮时要调用一个函数。在这里,clicked 信号需要连接到一个可调用的函数。可以使用以下任何一种技术来实现:
button.clicked.connect(slot_function)
示例
在下面的示例中,两个 QPushButton 对象(b1 和 b2)被添加到 QDialog 窗口中。我们希望在分别单击 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()
以上代码产生以下输出:
输出
Button 1 clicked Button 2 clicked