我想创建一个GUI,其中有三个水平滑块来控制一些概率。每个滑块的范围都可以在0-1.0之间,但所有三个滑块在任何时候都必须加起来等于1.0。这里是我发现的一个链接,它使用jQuery实现了我想要的功能:链接。
有没有在Qt中实现这个功能的好方法?具体而言,PyQt是否可行,但我认为伪代码也足够了。
有没有在Qt中实现这个功能的好方法?具体而言,PyQt是否可行,但我认为伪代码也足够了。
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
layout = QGridLayout()
self.sliders = []
slider_amount = 3
slider_precision = 10000 # sliders work only with ints, so large ints are used and mapped to floats
for i in range(slider_amount):
slider = QSlider(Qt.Horizontal)
slider.setRange(0, slider_amount*slider_precision)
slider.setSingleStep(slider.maximum()/100.0)
slider.setPageStep(slider.maximum()/20.0)
slider.valueChanged.connect(self.on_slider_value_changed)
slider.float_value = (i+1)/((1+slider_amount)/2.0*slider_amount) # provide your own default values
slider.label = QLabel()
self.sliders.append(slider)
layout.addWidget(slider, i, 0)
layout.addWidget(slider.label, i, 1)
self.update_slider_values()
self.setLayout(layout)
self.show()
def on_slider_value_changed(self, value):
changed_slider = self.sender()
changed_slider.float_value = float(value)/changed_slider.maximum()
delta = sum(slider.float_value for slider in self.sliders)-1
while abs(delta)>0.00001:
d = len(self.sliders)-1
for slider in self.sliders:
if slider is changed_slider:
continue
old_value = slider.float_value
slider.float_value = min(max(0, old_value-delta/d), 1)
delta -= old_value-slider.float_value
d -= 1
self.update_slider_values()
def update_slider_values(self):
for slider in self.sliders:
slider_signals_blocked = slider.blockSignals(True)
slider.setValue(round(slider.float_value*slider.maximum()))
slider.blockSignals(slider_signals_blocked)
slider.label.setText('{:.2f}'.format(slider.float_value))
app = QApplication(sys.argv)
mw = MainWindow()
app.exec_()
float
实际上有64位...而int
则是无限制的。 - Oleh Prypin您需要将滑块的valueChanged
信号连接到自己定义的槽函数。在这个槽函数中,您可以实现所有滑块新值的计算,并使用setValue
槽函数来应用这些新值。