3

シグナルとスロットを使用して 2 つのスライダーをリンクする、次のような単純な例を考えてみましょう。

from PySide.QtCore import *
from PySide.QtGui import *
import sys

class MyMainWindow(QWidget):
 def __init__(self):
  QWidget.__init__(self, None)

  vbox = QVBoxLayout()

  sone = QSlider(Qt.Horizontal)
  vbox.addWidget(sone)

  stwo = QSlider(Qt.Horizontal)
  vbox.addWidget(stwo)

  sone.valueChanged.connect(stwo.setValue)

if __name__ == '__main__':
 app = QApplication(sys.argv)
 w = MyMainWindow()
 w.show()
 sys.exit(app.exec_())

2 番目のスライダーが最初のスライダーと反対方向に動くようにするには、これをどのように変更しますか? スライダー 1 は、次の値で初期化されます。

  sone.setRange(0,99)
  sone.setValue(0)

また、スライダー 2 は次の値で初期化されます。

  stwo.setRange(0,99)
  stwo.setValue(99)

そして、stwo の値は になります99 - sone.sliderPosition

これを機能させるには、シグナルとスロットをどのように実装しますか? 上記の単純な例に基づいた実用的な例をいただければ幸いです。

4

3 に答える 3

3

あなたは物事を行う関数に信号を接続することができます。コードはそれを簡単に実行できるように構成されておらず、リファクタリングが必要なため、簡単な方法で実行できます。

stwo.setInvertedAppearance(True)
sone.valueChanged.connect(stwo.setValue)
于 2012-06-04T05:36:18.280 に答える
3

レイアウトの親を設定するのを忘れ、後でアクセスできるようにスライダー ウィジェットをメンバー属性として保存するのを忘れたため、例は少し壊れています...しかし、質問に答えるには、接続をポイントするのと同じくらい簡単ですあなた自身の機能に:

class MyMainWindow(QWidget):
    def __init__(self):
        QWidget.__init__(self, None)

        vbox = QVBoxLayout(self)

        self.sone = QSlider(Qt.Horizontal)
        self.sone.setRange(0,99)
        self.sone.setValue(0)
        vbox.addWidget(self.sone)

        self.stwo = QSlider(Qt.Horizontal)
        self.stwo.setRange(0,99)
        self.stwo.setValue(99)
        vbox.addWidget(self.stwo)

        self.sone.valueChanged.connect(self.sliderChanged)

    def sliderChanged(self, val):
        self.stwo.setValue(self.stwo.maximum() - val)

how が元のスロットsliderChanged()と同じ署名を持っていることに注意してください。setValue()1 つのウィジェットを他のウィジェットに直接接続する代わりに、それをカスタム メソッドに接続してから、値を必要なものに変換し、必要な方法で動作します (カスタム値を に設定しますstwo) 。

于 2012-06-04T05:38:50.687 に答える
0

これが私がやった方法です。setValueを再実装するこのクラスを追加しました。(私はhttp://zetcode.com/tutorials/pyqt4/eventsandsignals/からアイデアを得ました)

class MySlider(QSlider):
    def __init__(self):
        QSlider.__init__(self, Qt.Horizontal)

    def setValue(self, int):
        QSlider.setValue(self, 99-int)

これが完全なコードです。これは良いアプローチですか?

from PySide.QtCore import *
from PySide.QtGui import *
import sys

class MySlider(QSlider):
    def __init__(self):
        QSlider.__init__(self, Qt.Horizontal)

    def setValue(self, int):
        QSlider.setValue(self, 99-int)

class MyMainWindow(QWidget):
 def __init__(self):
  QWidget.__init__(self, None)

  vbox = QVBoxLayout()

  sone = QSlider(Qt.Horizontal)
  sone.setRange(0,99)
  sone.setValue(0)
  vbox.addWidget(sone)

  stwo = MySlider()
  stwo.setRange(0,99)
  stwo.setValue(0)
  vbox.addWidget(stwo)

  sone.valueChanged.connect(stwo.setValue)

  self.setLayout(vbox)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyMainWindow()
    w.show()
    sys.exit(app.exec_())
于 2012-06-04T05:38:15.733 に答える