Tôi thiết kế một widget tùy chỉnh mà về cơ bản là một QGroupBox tổ chức một số cấu hình của QCheckBox nút, trong đó mỗi một trong số họ phải kiểm soát một chút đặc biệt trong một bitmask đại diện theo số QBitArray. Để làm điều đó, tôi đã thêm các QCheckBox trường hợp để một QButtonGroup, với mỗi nút được một số nguyên ID:Kết nối một tín hiệu pyQT quá tải sử dụng kiểu mới cú pháp
def populate(self, num_bits, parent = None):
"""
Adds check boxes to the GroupBox according to the bitmask size
"""
self.bitArray.resize(num_bits)
layout = QHBoxLayout()
for i in range(num_bits):
cb = QCheckBox()
cb.setText(QString.number(i))
self.buttonGroup.addButton(cb, i)
layout.addWidget(cb)
self.setLayout(layout)
Sau đó, mỗi khi người dùng sẽ click vào một ô trống chứa trong self.buttonGroup , Tôi muốn self.bitArray được thông báo để bit tương ứng trong mảng có thể được đặt/bỏ đặt tương ứng. Cho rằng tôi có ý định kết nối QButtonGroup củabuttonClicked (int) tín hiệu để QBitArray củatoggleBit (int) phương pháp và, để được như pythonic càng tốt, tôi muốn sử dụng kiểu mới tín hiệu cú pháp, vì vậy tôi cố gắng này :
self.buttonGroup.buttonClicked.connect(self.bitArray.toggleBit)
vấn đề là buttonClicked là một tín hiệu quá tải, do đó cũng là buttonClicked (QAbstractButton *) chữ ký. Trong thực tế, khi chương trình được thực hiện tôi nhận được lỗi này khi tôi nhấp vào hộp kiểm:
The debugged program raised the exception unhandled TypeError
"QBitArray.toggleBit(int): argument 1 has unexpected type 'QCheckBox'"
trong đó cho thấy rõ toggleBit phương pháp nhận được buttonClicked (QAbstractButton *) tín hiệu thay vì buttonClicked (int) một.
Vì vậy, câu hỏi là, làm thế nào tôi có thể xác định kết nối tín hiệu, sử dụng kiểu mới cú pháp, do đó self.bitArray nhận buttonClicked (int) tín hiệu thay vì sự quá tải mặc định - buttonClicked (QAbstractButton *)?
EDIT: Các PyQT's New-style Signal and Slot Support documentation khẳng định bạn có thể sử dụng pyqtSlot trang trí để xác định các tín hiệu mà bạn muốn kết nối với một khe nhất định, nhưng đó là đối với một khe cắm bạn đang tạo. Phải làm gì khi khe từ một lớp "đã sẵn sàng"? Là lựa chọn duy nhất subclassing nó và sau đó reimplementing các khe nhất định với trang trí bên phải?