如何使用好pyqt的signal和slot

2021-06-11 23:17:59 字數 2214 閱讀 4015

如果你是使用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 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以後的版本。 建議您開始使用這種新的方式吧。

如何使用好Redis?

一 快取和資料庫雙寫一致性問題 二 快取雪崩問題 三 快取擊穿問題 四 快取的併發競爭問題 分析 這個問題其實是對redis內部機制的乙個考察。其實根據博主的面試經驗,很多人其實都不知道redis是單執行緒工作模型。所以,這個問題還是應該要複習一下的。回答 主要是以下三點 一 純記憶體操作 二 單執...

如何使用雲儲存以及使用好處

如何更好的使用雲儲存 使用郵箱 郵箱可以作為雲儲存的較為便捷的應用,目前郵箱的體積都非常大,可以儲存較大的檔案。我們可以通過寫郵件草稿,儲存附件的方式來存檔案。對於工作中經常需要交流的文件,也可以在郵箱的發件箱中找到備份。使用網盤 現在的網盤動輒幾十個t,作為普通的使用幾乎是無法用完的。我們可以在電...

如何用好SVN的Branch

在svn裡面我們一般會建立出三個資料夾 trunk 主幹 branch 分支 tag 標籤 在我們專案一開始的時候我們會將 檔案 這邊暫時不涉及文件的管理 放在trunk底下。然後我們就不斷的開始工作了。什麼時候我們會用到branch。按我的經驗的話我們用到branch有兩種情況 專案穩定了要rel...