如果你是使用pyqt 4.5之後的版本,除了傳統的signal/slot的連線方式外,你還多了一種比較符合python樣式的寫法。 這種寫法是透過下面兩種新的pyqt物件來達成
正如其名, pyqtsingal是用來定義signal,而
pyqtslot 則是用於slot。
首先,我們來了解如何利用pyqtsignal來制定乙個signal。
qt的官方文件中有說明,signal只能在qobject的子類中定義。如果在子類外直接定義,會出現 attributeerror: 'pyqt4.qtcore.pyqtsignal' object has no attribute 'emit'
且看下面的範例:
from pyqt4 import qtcoreclass 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整個slot的定義與舊的方法相較,頓時變得簡單許多。如果,你的ui使透過pyuic4所製作出來的,那 甚至可以透過 slot的名稱來指定要鏈結的元件與signal。舉例來說,如果你的ui中有乙個名為mybtn的按鈕,想要連線他的clicked signal。你只要在你繼承的視窗類別中,定義如下的slot:()def myslot(self):
print 'myslot received a signal')
@qtcore.pyqtslot
(int)
def myslot2(self, arg):
print 'myslot2 received a signal with argument %d' % arg)
@qtcore.pyqtslotpyqt會自動將這個slot與ui內的mybtn的clicked singal連線起來。真的是非常省事。(bool)
def on_mybtn_clicked(self, checked):
print 'mybtn clicked.'
新的singal/slot的定義與使用方式是pyqt 4.5中的一大改革。可以讓pyqt程式更清楚易讀。如果你也是用pyqt 4.5以後的版本。 建議您開始使用這種新的方式吧。
如何使用好Redis?
一 快取和資料庫雙寫一致性問題 二 快取雪崩問題 三 快取擊穿問題 四 快取的併發競爭問題 分析 這個問題其實是對redis內部機制的乙個考察。其實根據博主的面試經驗,很多人其實都不知道redis是單執行緒工作模型。所以,這個問題還是應該要複習一下的。回答 主要是以下三點 一 純記憶體操作 二 單執...
如何使用雲儲存以及使用好處
如何更好的使用雲儲存 使用郵箱 郵箱可以作為雲儲存的較為便捷的應用,目前郵箱的體積都非常大,可以儲存較大的檔案。我們可以通過寫郵件草稿,儲存附件的方式來存檔案。對於工作中經常需要交流的文件,也可以在郵箱的發件箱中找到備份。使用網盤 現在的網盤動輒幾十個t,作為普通的使用幾乎是無法用完的。我們可以在電...
如何用好SVN的Branch
在svn裡面我們一般會建立出三個資料夾 trunk 主幹 branch 分支 tag 標籤 在我們專案一開始的時候我們會將 檔案 這邊暫時不涉及文件的管理 放在trunk底下。然後我們就不斷的開始工作了。什麼時候我們會用到branch。按我的經驗的話我們用到branch有兩種情況 專案穩定了要rel...