PyQt5 信号和槽
与顺序执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。函数或方法按照用户的操作(例如点击按钮、从集合中选择项目或点击鼠标等)来执行,这些操作被称为 事件 。
用于构建GUI界面的小部件充当这些事件的来源。每个PyQt小部件都是从QObject类派生而来,设计为响应一个或多个事件而发出 信号 。信号本身不执行任何操作,而是与一个 槽 连接。槽可以是任何可调用的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)
假设当点击按钮时要调用一个函数。这里,点击信号要连接到一个可调用的函数。可以通过以下任一技术来实现-
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()
上述代码生成以下输出:
输出
Button 1 clicked
Button 2 clicked