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 のメンバ変数としてデータを埋め込む
ことで実現することができました。