现在的位置: 首页 > 综合 > 正文

如何使用PyQT4中新的Signal/Slot定義方式

2013年08月19日 ⁄ 综合 ⁄ 共 1786字 ⁄ 字号 评论关闭

************************************************************************************

www.xiabanl.com,下班了社区。朋友们多支持,最好提些建议,非常感谢

*************************************************************************************

 

如果你是使用PyQT 4.5之後的版本,除了傳統的signal/slot的連接方式外,你還多了一種比較符合Python樣式的寫法。
這種寫法是透過下面兩種新的PyQT物件來達成

  • pyqtSignal

  • pyqtSlot

正如其名, pyqtSingal是用來定義signal,而pyqtSlot
則是用於slot。

首先,我們來了解如何利用pyqtSignal來制定一個signal。且看下面的範例:

 from PyQt4 import QtCore

class MyQObject(QtCore.QObject):
# 定義一個無參數的signal
signal1 = QtCore.pyqtSignal()

# 定義一個有一個整數參數的signal,並且name為qtSignal2。
signal2 = QtCore.pyqtSignal(int, name='qtSignal2')

def connectSigSlot(self):
# 利用pySignal物件本身提供的connect,我們可以輕易的將pySignal物件與對應的slot相連。

# 將signal1與myReceiver1連接起來。
signal1.connect(self.myReceiver1)
# 將signal2與myReceiver2連接起來。
signal2.connect(self.myReceiver2)

def myEmitter(self, arg):
# 利用pyqtSignal物件所提供的emit function,我們就可以輕易的發出signal。
signal1.emit()
signal2.emit(10)

def myReceiver1(self):
print 'myReceiver1 called'

def myReceiver2(self, arg):
print 'myReceiver2 called with argument value %d' % arg

簡單的說,透過pyqtSignal,將signal也視為一種物件,所以signal所需的功能皆可由signal本身的method來定義。
所以整個signal的定義與使用完全符合物件導向的精神,程式看起來也更為直覺。

而pySlot則是一個Python的decorator,我們可以透過他來將一個method定義為slot。

@QtCore.pyqtSlot
()
def mySlot(self):
print 'mySlot received a signal')

@QtCore.pyqtSlot (int)
def mySlot2(self, arg):
print 'mySlot2 received a signal with argument %d' % arg)

整個slot的定義與舊的方法相較,頓時變得簡單許多。如果,你的UI使透過pyuic4所製作出來的,那 甚至可以透過
slot的名稱來指定要連結的元件與signal。舉例來說,如果你的UI中有一個名為myBtn的按鈕,想要連接他的clicked
signal。你只要在你繼承的視窗類別中,定義如下的slot:

@QtCore.pyqtSlot
(bool) 
def on_myBtn_clicked(self, checked):
print 'myBtn clicked.'

PyQT會自動將這個slot與UI內的myBtn的clicked singal連接起來。真的是非常省事。

新的singal/slot的定義與使用方式是PyQT 4.5中的一大改革。可以讓PyQT程式更清楚易讀。如果你也是用PyQT 4.5以後的版本。
建議您開始使用這種新的方式吧。

Reference:

抱歉!评论已关闭.