PySide(或PyQt)信号和插槽基础知识

时间:2012-06-04 05:25:06

标签: python pyqt signals-slots pyside

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

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

你会如何改变这一点,以便第二个滑块以与第一个滑块相反的方向移动?滑块1将使用以下值进行初始化:

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

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

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

然后stwo的值为99 - sone.sliderPosition

如何实现信号和插槽以使其工作?我将非常感谢一个基于上述简单示例的工作示例。

3 个答案:

答案 0 :(得分:3)

您可以将信号连接到执行操作的功能。您的代码的结构不是为了轻松完成并需要重构,因此您可以通过简单的方式完成:

stwo.setInvertedAppearance(True)
sone.valueChanged.connect(stwo.setValue)

答案 1 :(得分: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上设置自定义值)

答案 2 :(得分: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_())