3

確率を制御する3つの水平スライダーを持つGUIを構築しようとしています。各スライダーの範囲は0〜1.0ですが、3つすべてを合わせて常に1.0に等しくする必要があります。これが私が見つけたリンクで、私が望むことを実行しますが、jQueryを使用します。

Qtでこれを行う良い方法はありますか?より具体的にはPyQtですが、擬似コードで十分だと思います。

4

2 に答える 2

3
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_()
于 2012-06-22T15:24:46.840 に答える
0

valueChangedスライダーの信号を自分で定義したスロットに接続する必要があります。このスロット (関数) では、すべてのスライダーの新しい値の計算を実装し、setValueスロットを使用して新しい値を適用できます。

于 2012-06-22T07:04:36.953 に答える