Wizard Notes

Python, JavaScript を使った音楽信号分析の技術録、作曲活動に関する雑記

PyQt: 複数のQPushButtonに単一スロット(値の受け取り関数)を割り当てる

f:id:Kurene:20210209223443p:plain

PyQt で複数のQPushButton Widget を使う場合、愚直に書くと以下のようになります。

class MainWindow(QWidget):
    def __init__(self, n_buttons):
        super().__init__()
        layout = QVBoxLayout()
        self.setLayout(layout)
        
        button = QPushButton(f"Button 0")
        button.clicked.connect(self.on_change_bt0)
        layout.addWidget(button)

        button = QPushButton(f"Button 1")
        button.clicked.connect(self.on_change_bt1)
        layout.addWidget(button)

    def on_change_bt0(self):
     # ...

    def on_change_bt1(self):
     # ...

拡張性を考えると、1つのon_change関数だけで実装したくなります。

そこで以下の実装では、複数のQPushButtonのスロット・シグナルの接続において1つのon_change関数で実装してみました。

さらに実用的には、on_change関数の中でどのQPushButtonから呼ばれたか判別できるようにしました。

これは、

  • on_change()の中でself.sender()を使う
    • シグナルの呼び出し元のWidgetオブジェクトを呼び出すことができる
    • on_change()のように、通知された値を受け取る関数をスロットと呼ぶ
  • QPushButton widget のメンバ変数としてデータを埋め込む

ことで実現することができました。

実装例

参考