
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()のように、通知された値を受け取る関数をスロットと呼ぶ
QPushButtonwidget のメンバ変数としてデータを埋め込む
ことで実現することができました。