Как подключить QSlider к QDoubleSpinBox - PullRequest
5 голосов
/ 09 января 2012

Я хочу подключить 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)) );

Ответы [ 5 ]

7 голосов
/ 09 января 2012

Вам нужно будет добавить свой собственный слот, который преобразует тип аргумента и выдает сигнал или обновляет ползунок напрямую.

6 голосов
/ 09 января 2012

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 () для правильного объекта

3 голосов
/ 09 января 2012

Как ответил Дейв Килиан, сигналы и слоты для QSlider не используют double.Кроме того, Qt 4 не выполняет автоматическое преобразование типов;это не позволит вам подключить их.Таким образом, вам придется написать свой слот конвертации, который обновит значение другого предмета.

2 голосов
/ 03 февраля 2015

Надеюсь, это поможет вам.

#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"
0 голосов
/ 25 июня 2013

В этом очень похожем вопросе приведен пример кода о том, как создавать свои собственные слоты и излучать сигналы:

использовать созданный вектор в качестве диапазона для QDoubleSpinBox и QSlider

...