Cách tốt nhất để vượt qua các đối số là không vượt qua họ ở tất cả. Bạn có thể sử dụng tính năng động của python và đặt bất kỳ dữ liệu nào bạn cần làm thuộc tính của riêng bạn trên tiện ích con, nhận tiện ích mục tiêu trong trình xử lý bằng cách sử dụng self.sender()
và sau đó nhận bất kỳ thuộc tính nào bạn cần trực tiếp từ tiện ích.
Trong ví dụ này năm nút được tạo ra và nhà nước cần được thiết lập trên widget nút như my_own_data
tài sản:
import sys
from PyQt4 import QtGui, QtCore
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.centralwidget = QtGui.QWidget()
self.vboxlayout = QtGui.QVBoxLayout()
for idx in range(5):
button = QtGui.QPushButton('button ' + str(idx), None)
button.my_own_data = str(idx) # <<< set your own property
button.clicked.connect(self.click_handler) # <<< no args needed
self.vboxlayout.addWidget(button)
self.centralwidget.setLayout(self.vboxlayout)
self.setCentralWidget(self.centralwidget)
self.show()
def click_handler(self, data=None):
if not data:
target = self.sender() # <<< get the event target, i.e. the button widget
data = target.my_own_data # <<< get your own property
QtGui.QMessageBox.information(self,
"you clicked me!",
"my index is {0}".format(data))
app = QtGui.QApplication(sys.argv)
main = Main()
main.show()
sys.exit(app.exec_())
Câu trả lời này dường như không phổ biến lắm. 'QSignalMapper' có được sử dụng rộng rãi không? – 101
@figs. Tôi không biết tại sao OP chấp nhận câu trả lời này, cho rằng giải pháp 'lambda/partial' thông thường đã được đưa ra. Đã có một lần khi 'QSignalMapper' hữu ích hơn, vì PyQt không phải lúc nào cũng được hỗ trợ bằng cách sử dụng' lambda/partial' như một khe - nhưng đó là một thời gian dài trước đây.Tại thời điểm này, mặc dù, tôi không thể nghĩ về một kịch bản mà nó có thể có hiệu quả hơn (khác hơn trong C + +, tất nhiên). – ekhumoro