PyQt - 信号与槽



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

用于构建 GUI 界面的控件充当此类事件的源。每个从 QObject 类派生的 PyQt 控件都设计为响应一个或多个事件发出“信号”。信号本身不会执行任何操作。相反,它会“连接”到一个“”。槽可以是任何可调用的 Python 函数

在 PyQt 中,信号和槽之间的连接可以通过不同的方式实现。以下是最常用的技术:

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

当小部件发出信号时,调用槽函数的更便捷方法如下:

widget.signal.connect(slot_function)

假设当单击按钮时要调用一个函数。此处,clicked 信号需要连接到一个可调用函数。可以通过以下两种技术中的任何一种来实现:

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

或者

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() 函数

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

示例

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui 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)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

以上代码产生以下输出:

Signals and Slots Output

输出

Button 1 clicked
Button 2 clicked
广告