如何使用好pyqt的signal和slot

如果你是使用PyQT 4.5之後的版本,除了傳統的signal/slot的連接方式外,你還多了一種比較符合Python樣式的寫法。 這種寫法是透過下面兩種新的PyQT物件來達成
  • pyqtSignal
  • pyqtSlot
正如其名, pyqtSingal是用來定義signal,而 pyqtSlot 則是用於slot。
首先,我們來了解如何利用pyqtSignal來制定一個signal。

qt的官方文档中有说明,signal只能在QObject的子类中定义。如果在子类外直接定义,会出现 AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'emit'

且看下面的範例:
 from PyQt4 import QtCore



class MyQObject(QtCore.QObject):

# 定義一個無參數的signal

signal1 = QtCore.pyqtSignal()



# 定義一個有一個整數參數的signal,並且name為qtSignal2。

signal2 = QtCore.pyqtSignal(int, name='qtSignal2')

 
   def __init__(self):
      super(MyQObject, self).__init__()     #如果写了__init__()函数,这一行一定要有,否则会出现TypeError: pyqtSignal must be bound to a QObject, not 'MyQObject'

def connectSigSlot(self):

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



# 將signal1與myReceiver1連接起來。

self.signal1.connect(self.myReceiver1)

# 將signal2與myReceiver2連接起來。

       self.signal2.connect(self.myReceiver2)



def myEmitter(self):

# 利用pyqtSignal物件所提供的emit function,我們就可以輕易的發出signal。

self.signal1.emit()

self.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以後的版本。 建議您開始使用這種新的方式吧。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值