Pyqt/Qt訊號與槽的理解(四)
阿新 • • 發佈:2019-01-06
使用自定義引數
在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_())
演示效果:
程式碼分析:
單擊“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))