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
廣告

© . All rights reserved.