如何将QSlider连接到QDoubleSpinBox

时间:2012-01-09 16:22:15

标签: qt connect signals-slots qslider

我想将QSlider连接到QDoubleSpinBox但是当代码编译得很好并且运行简单的QSpinBox时,它对QDoubleSpinBox不起作用

QSlider *horizontalSlider1 = new QSlider();
QDoubleSpinBox *spinBox1 = new QDoubleSpinBox();

connect(spinBox1, SIGNAL(valueChanged(double)),horizontalSlider1,SLOT(setValue(double)) );
connect(horizontalSlider1,SIGNAL(valueChanged(double)),spinBox1,SLOT(setValue(double)) );

6 个答案:

答案 0 :(得分:7)

您必须添加自己的插槽,该插槽可转换参数类型并发出信号或直接更新滑块。

答案 1 :(得分:6)

QSlider和QDoubleSpinBox在valueChanged / setValue中使用不同类型的参数(QSlider使用整数,QDoubleSpinBox使用双精度数,当然)。更改滑块信号和插槽的参数类型可能会有所帮助:

connect(spinBox1, SIGNAL(valueChanged(double)),horizontalSlider1,SLOT(setValue(int)) );
connect(horizontalSlider1,SIGNAL(valueChanged(int)),spinBox1,SLOT(setValue(double)) );

我不确定Qt能否为您自动处理此类型转换;如果没有,你将必须定义自己的插槽来调用正确对象上的setValue()

答案 2 :(得分:3)

正如Dave Kilian所说,QSlider的信号和插槽不使用double。此外,Qt 4不会自动转换类型;它不允许你连接它们。因此,您必须编写自己的转换槽,以更新其他项目的值。

答案 3 :(得分:2)

希望这可以帮到你。

#include <QApplication>
#include <QtGui>
#include <QVBoxLayout>
#include <QSlider>
#include <QLabel>

class DoubleSlider : public QSlider {
    Q_OBJECT

public:
    DoubleSlider(QWidget *parent = 0) : QSlider(parent) {
        connect(this, SIGNAL(valueChanged(int)),
            this, SLOT(notifyValueChanged(int)));
    }

signals:
    void doubleValueChanged(double value);

public slots:
    void notifyValueChanged(int value) {
        double doubleValue = value / 10.0;
        emit doubleValueChanged(doubleValue);
    }
};

class Test : public QWidget {
    Q_OBJECT
public:
    Test(QWidget *parent = 0) : QWidget(parent),
        m_slider(new DoubleSlider()),
        m_label(new QLabel())
    {
        m_slider->setOrientation(Qt::Horizontal);
        m_slider->setRange(0, 100);
        QVBoxLayout *layout = new QVBoxLayout(this);
        layout->addWidget(m_slider);
        layout->addWidget(m_label);
        connect(m_slider, SIGNAL(doubleValueChanged(double)),
            this, SLOT(updateLabelValue(double)));
        updateLabelValue(m_slider->value());
    }

public slots:
    void updateLabelValue(double value) {
        m_label->setText(QString::number(value, 'f', 2));
    }

private:
    QSlider *m_slider;
    QLabel *m_label;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Test *wid = new Test();
    wid->show();

    return a.exec();
}

#include "main.moc"

答案 4 :(得分:0)

在这个非常相似的问题中,有一些关于如何创建自己的插槽和发出信号的示例代码:

use a created vector as range for QDoubleSpinBox and QSlider

答案 5 :(得分:0)

将 QSlider 或 QDial 同步到 QDoubleSpinBox 的一个问题是,当 QDoubleSpinBox 更新 QDial 或 QSlider 时,将触发 QDial 或 QSlider valueChanged 信号,导致它们更新 QDoubleSpinBox 作为回报。这会导致您无法在 QDoubleSpinBox 中输入十进制值的问题,因为当您输入十进制“.”时,QDial/Slider 更新会覆盖十进制,从而阻止您输入十进制值的其余部分。

为了解决这个问题,让每个输入小部件检查它们的值是否已经与它们正在写入的小部件中的值匹配,如果匹配,则不要更新该值。下面是一个允许 QDial 和 QDoubleSpinBox 相互更新的函数示例:

    def syncDialAndSpinbox(self, widget_in, widget_out):
        if isinstance(widget_in, QtWidgets.QDial):
            value =  float(widget_in.value())*100.0/float(widget_in.maximum())
            out_value = widget_out.value()
        else:
            value = round(widget_in.value()*widget_out.maximum()/100)
            out_value = widget_out.value()

        if value != out_value:
            widget_out.setValue(value)

在此示例中,QDoubleSpinBox 是一个百分比 (0.0-100.0),而 QDial 有 100,000 步,以支持将百分比浮点输出到小数点后三位(0.000% 到 100.000%)。