3

考虑一个像这样的简单示例,它使用信号和插槽链接两个滑块:

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_())

您将如何更改此设置,以使第二个滑块与第一个滑块朝相反的方向移动?滑块一将使用以下值初始化:

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

滑块二将使用以下值初始化:

  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)

请注意如何与原始插槽sliderChanged()具有相同的签名。setValue()不是将一个小部件直接连接到另一个小部件,而是将其连接到自定义方法,然后将值转换为您想要的值,然后按照您的意愿行事(在 上设置自定义值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 回答