PySide(或PyQt的)信号和槽基本(PySide (or PyQt) signals and

2019-06-25 04:03发布

考虑一个简单的例子是这样哪些链接使用信号和槽两个滑块:

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)

而滑盖其中2使用这些值来初始化:

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

然后stwo的价值将是99 - sone.sliderPosition

你将如何实现信号和槽,使这项工作? 我希望的是建立在简单的例子上述工作的例子。

Answer 1:

你举的例子是有点坏了,因为你忘了设置布局的父,也节省滑块控件作为成员属性稍后访问......但是,为了回答你的问题,它真的那么简单,只是指出你的连接你自己的功能:

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



Answer 2:

您可以信号连接到做事的功能。 您的代码不是用来做的,很容易和需要重构,这样你就可以做到这一点的简单方法:

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


Answer 3:

下面是我做的方式。 我添加了这个类重新实现了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_())


文章来源: PySide (or PyQt) signals and slots basics