考虑一个这样的简单示例,它使用信号和插槽链接两个滑块:
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
。
如何实现信号和插槽以使其工作?我将非常感谢一个基于上述简单示例的工作示例。
答案 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_())