考虑一个简单的例子是这样哪些链接使用信号和槽两个滑块:
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
。
你将如何实现信号和槽,使这项工作? 我希望的是建立在简单的例子上述工作的例子。
你举的例子是有点坏了,因为你忘了设置布局的父,也节省滑块控件作为成员属性稍后访问......但是,为了回答你的问题,它真的那么简单,只是指出你的连接你自己的功能:
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
)
您可以信号连接到做事的功能。 您的代码不是用来做的,很容易和需要重构,这样你就可以做到这一点的简单方法:
stwo.setInvertedAppearance(True)
sone.valueChanged.connect(stwo.setValue)
下面是我做的方式。 我添加了这个类重新实现了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_())