1. 程式人生 > >Pyqt/Qt訊號與槽的理解(四)

Pyqt/Qt訊號與槽的理解(四)

使用自定義引數

在PyQt程式設計過程中,經常會遇到給槽函式傳遞自定義引數的情況,比如有一個訊號與槽函式的連線是

button1.clicked.connect(show_page)

我們知道對於clicked訊號來說,它是沒有引數的;對於show_page函式來說,希望它可以接收引數。希望show_page函式像如下這樣:

def show_page(self, name):
print(name,"  點選啦")

於是就產生一個問題——訊號發出的引數個數為0,槽函式接收的引數個數為1,由於0<1,這樣執行起來一定會報錯(原因是訊號發出的引數個數一定要大於槽函式接收的引數個數)。解決這個問題就是本節的重點:自定義引數的傳遞

from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys 

class WinForm(QMainWindow):  
    def __init__(self, parent=None):  
        super(WinForm, self).__init__(parent)  
        self.setWindowTitle("訊號和槽傳遞額外引數例子")
        button1 = QPushButton('Button 1'
) button2 = QPushButton('Button 2') button1.clicked.connect(lambda: self.onButtonClick(1)) button2.clicked.connect(lambda: self.onButtonClick(2)) layout = QHBoxLayout() layout.addWidget(button1) layout.addWidget(button2) main_frame = QWidget() main_frame.setLayout(layout) self.setCentralWidget(main_frame) def
onButtonClick(self, n):
print('Button {0} 被按下了'.format(n)) QMessageBox.information(self, "資訊提示框", 'Button {0} clicked'.format(n)) if __name__ == "__main__": app = QApplication(sys.argv) form = WinForm() form.show() sys.exit(app.exec_())

演示效果:

這裡寫圖片描述
這裡寫圖片描述qt

程式碼分析:

單擊“Button 1”按鈕,將彈出一個資訊提示框,提示資訊為“Button 1 clicked”。Python控制檯的輸出資訊為:

Button 1 被按下了

這裡重點解釋onButtonClick()函式是怎樣處理從兩個按鈕傳來的訊號的。使用lambda表示式傳遞按鈕數字給槽函式,當然也可以傳遞其他任何東西,甚至是按鈕控制元件本身(假設槽函式打算把傳遞訊號的按鈕修改為不可用的話)。

另一種解決方法是使用functools中的partial函式:

button1.clicked.connect(partial(self.onButtonClick, 1))           
button2.clicked.connect(partial(self.onButtonClick, 2))