2015/04/27

PyQt5を使う (ウィジェット間のシグナル連携)

前回、シグナルをスロットに接続するとユーザ操作に対する応答ができると書きました。
今回は異なるウィジェットのスロットにシグナルを接続してウィジェット間で同期をとる方法です。

書籍ではサンプルとして、スライダーとスピンボックスを同期させていました。

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QSpinBox, QSlider, QWidget, QHBoxLayout

if __name__ == '__main__':
    app = QApplication(sys.argv)

    window= QWidget()
    window.setWindowTitle('Enter Your Age')

    slider = QSlider(Qt.Horizontal)
    slider.setRange(0, 130)

    spin = QSpinBox()
    spin.setRange(0, 130)

    spin.valueChanged[int].connect(slider.setValue)
    slider.valueChanged[int].connect(spin.setValue)

    spin.setValue(35)

    layout = QHBoxLayout()
    layout.addWidget(spin)
    layout.addWidget(slider)
    window.setLayout(layout)
    window.show()

    sys.exit(app.exec_())


実行すると、こんな画面が表示されます。
(前回とウィンドウの雰囲気が違いますが、これはWin8とWin7の違いです)



スピンボックスの値が変化すると、同時にスライダーのバーの位置も変わりますね。

スピンボックスのvalueChangedシグナルにスライダーのsetValueメソッドを接続する(19行目)ことで、スピンボックスの値が変化するたびに、スライダーの値が変更されるようになっています。

同様にスライダーのvalueChangedシグナルにはスピンボックスのsetValueメソッドを接続する(20行目)ようにしていますので、スピンボックスとスライダーのシグナルが交互に永遠に発行されるようにも見えますが、値の変化がなければvalueChangedシグナルは発行されませんので、永遠に処理が返ってこないようなことにはなりません。

このように相互のウィジェットのメソッドにシグナルを接続することで簡単にウィジェット間の同期をとることができるようになるんですね♪