1. 程式人生 > >PyQt之玩轉signal(訊號)與slot(槽)一:介紹及簡單例項

PyQt之玩轉signal(訊號)與slot(槽)一:介紹及簡單例項

訊號與槽機制作為Qt最重要的特性,提供了任意兩個QT物件之間的通訊機制。其中,訊號會在某個特定情況或動作下被觸發,槽是用於接收並處理訊號的函式。每個Qt物件都包含預定的訊號和槽,當一某一特定事件發生時,一個訊號被髮射,與訊號相關聯的槽則會響應訊號完成相應的處理。
訊號與槽機制常用的連線方式為:
  connect(Object1,SIGNAL(signal),Object2,SLOT(slot))
上文說的兩個物件,就體現在connect函式中的Object1和Object2,signal是Object1物件的訊號,注意要用SIGNAL巨集包起來。當一個特定事件發生的時候(如點選按鈕)或者Object1呼叫emit函式的時候,signal訊號被髮射。slot(槽)就是一個可以被呼叫處理特定訊號的函式

(或方法),是普通的物件成員函式。
特點:
1.一個訊號可以與另一個訊號相連
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1))
即表示Object1的訊號1發射可以觸發Object2的訊號1發射。
2.表示一個訊號可以與多個槽相連
connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2))
connect(Object1,SIGNAL(signal2),Object3,SLOT(slot1))
3.表示同一個槽可以響應多個訊號
connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2))
connect(Object3,SIGNAL(signal2),Object2,SLOT(slot2))
從以上特點可以看出訊號和槽是寬鬆地聯絡在一起的:一個發射訊號的物件不用知道也不用注意哪個槽或哪些槽要接收這個訊號。物件只負責傳送訊號,它不知道也不需要知道另一端是誰在接收這個訊號。同樣的,一個槽也不知道是否有任何訊號與自己相連線。

一個簡單例項:點選close按鈕關閉應用程式
這裡寫圖片描述

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)

        button = QtGui.QPushButton('close', self)
        button.move(100, 60)
        self.connect(button, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT('close()'
)) self.setWindowTitle('Signal & slot') self.resize(250, 150) app = QtGui.QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())

核心程式碼就是self.connect那一行,第一個引數時button,表示由button來發射訊號;第二個引數表示button狀態改變的時候(此處是點選)發射clicked()訊號;第三個表示接收訊號的物件,此處是self,表示Example物件;第四個引數表示接收到clicked()訊號後應該呼叫的函式,此處是close(),close()函式繼承自父類QWidget,表示關閉視窗。
所以如果點選了button按鈕後,button會發射clicked()訊號,該訊號會導致self物件的槽函式close()被執行,而close()的效果就是關閉視窗。所以點選button後,最終的效果就是視窗被關閉。