PyQt5 - 信号和插槽

  • 简述

    与以顺序方式执行的控制台模式应用程序不同,基于 GUI 的应用程序是事件驱动的。函数或方法响应用户的操作而执行,例如单击按钮、从集合中选择项目或单击鼠标等,称为events.
    用于构建 GUI 界面的小部件充当此类事件的来源。每个派生自 QObject 类的 PyQt 小部件旨在发出‘signal’响应一个或多个事件。信号本身不执行任何操作。相反,它“连接”到‘slot’. 插槽可以是任何callable Python function.
  • 使用 Qt Designer 的信号/槽编辑器

    首先设计一个带有 LineEdit 控件和 PushButton 的简单表单。
    插槽编辑器
    希望如果按下按钮,文本框的内容应该被删除。QLineEdit 小部件为此目的有一个 clear() 方法。因此,按钮的clicked信号要连接到clear()文本框的方法。
    首先,从 Edit 菜单中选择 Edit signals/slots(或按 F4)。然后用鼠标突出显示按钮并将光标拖向文本框
    光标
    释放鼠标时,将显示一个对话框,显示按钮信号和插槽方法。选择 clicked 信号和 clear() 方法
    清除方法
    右下角的信号/槽编辑器窗口将显示结果 -
    编辑器窗口
    从 ui 文件中保存 ui 和 Build 和 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)
    

    例子

    在以下示例中,在 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