PyQt之玩轉signal(訊號)與slot(槽)二:新增自定義槽
阿新 • • 發佈:2019-01-08
上文中我們實現了一個非常簡單的功能:點選按鈕關閉應用。不過那種呼叫connect函式的寫法是在QT程式設計中常用的(用C++語言寫QT應用),顯得中規中矩,我們這裡是PyQt,自然要來一種PyQt的寫法,我們先看程式碼:
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)
button.clicked.connect(QtCore.SIGNAL('clicked()'))
#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.clicked.connect(QtCore.SIGNAL(‘clicked()’))
我們編譯一下,發現有錯誤,如下圖所示:
錯誤的意思是connect裡面的引數一定要是一個callable(呼叫)或一個signal(訊號),而我們這裡是str型別。
知道了錯誤就好辦了,我們將引數修改為呼叫就好了嘛,如下:
button.clicked.connect(self.close)
這裡button.clicked是一個signal(訊號),這裡可以總結出來一個式子:
signal.connect(callable or signal)
前篇文章我們介紹了一個訊號可以與一個槽函式或者另一個訊號進行連線。引數callable相當於我們的槽函式。
再次編譯就不會報錯了。現在比較一下這兩者的好壞,第一種寫法是C++的寫法,而這種是Python的寫法,兩種都可以用,根據自己的習慣來。如果你是從QT程式設計師轉過來的話,那麼估計你青睞C++的寫法,不過我個人比較喜歡Python的寫法,誰叫我是Python程式設計師呢^_^。
上面的close函式是從QWidget裡繼承過來的,也就是系統自帶的函式。今天我們的重點是新增自定義槽函式。
我們舉個什麼例子呢?嗯,點選’change color’按鈕,讓背景顏色改變吧!
先來看程式碼:
import sys
from PyQt4 import QtGui, QtCore
class Example(QtGui.QWidget):
def change(self):
print 'You pressed the butthon'
palette = QtGui.QPalette(self)
palette.setColor(self.backgroundRole(), QtGui.QColor(192,253,123))
self.setPalette(palette)
def __init__(self):
QtGui.QWidget.__init__(self)
button = QtGui.QPushButton('change color', self)
button.move(100, 60)
self.setWindowTitle('Signal & slot')
self.resize(250, 150)
button.clicked.connect(self.change)
app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec_())
嗯,不用多說,也很簡單。connect裡面的引數是我們自定義的一個方法change,在這個change方法裡我們通過QPalette物件改變了背景色。點選按鈕後的效果如下圖所示: