7

基本的に、構成可能な数のQCheckBoxボタンを保持するQGroupBoxであるカスタムウィジェットを設計しています。各ボタンは、 QBitArrayで表されるビットマスクの特定のビットを制御する必要があります。これを行うために、 QCheckBoxインスタンスをQButtonGroupに追加し、各ボタンに整数IDを指定しました。

    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)

次に、ユーザーがself.buttonGroupに含まれるチェックボックスをクリックするたびに、self.bitArrayに通知して、配列内の対応するビットを適宜設定/設定解除できるようにします。そのために、QButtonGroupの buttonClicked(int)シグナルをQBitArrayの toggleBit(int)メソッドに接続することを意図し、可能な限りpythonicにするために、新しいスタイルのシグナル構文を使用したかったので、これを試しました。

self.buttonGroup.buttonClicked.connect(self.bitArray.toggleBit)

問題は、buttonClickedがオーバーロードされたシグナルであるため、buttonClicked(QAbstractButton *)シグネチャも存在することです。実際、プログラムの実行中に、チェックボックスをクリックすると次のエラーが発生します。

The debugged program raised the exception unhandled TypeError
"QBitArray.toggleBit(int): argument 1 has unexpected type 'QCheckBox'"

これは、toggleBitメソッドがbuttonClicked(int)信号ではなくbuttonClicked(QAbstractButton *)信号を受信したことを明確に示しています。

したがって、問題は、新しいスタイルの構文を使用して信号接続を指定し、 self.bitArrayがデフォルトのオーバーロードの代わりにbuttonClicked(int)信号を受信するようにするにはどうすればよいですか? buttonClicked(QAbstractButton *)

編集: PyQTの新しいスタイルの信号およびスロットサポートのドキュメントには、pyqtSlotデコレータを使用して、特定のスロットに接続する信号を指定できると記載されていますが、これは作成中のスロット用です。スロットが「既製」クラスのものである場合はどうすればよいですか?それをサブクラス化してから、指定されたスロットを適切なデコレータで再実装する唯一のオプションはありますか?

4

1 に答える 1

18

関連する質問を閲覧しているときに、この回答がまさに私が必要としていたものであることがわかりました。QButtonGroupの buttonClicked(int)シグナルのみをQBitArrayの toggleBit(int)に接続し、他のオーバーロードされた署名を無視するための正しい新しいスタイルのシグナル構文には、次のように括弧内に目的のタイプを指定する必要があります。

self.buttonGroup.buttonClicked[int].connect(self.bitArray.toggleBit)
于 2012-06-24T15:46:20.007 に答える