Qt: Создание QDoubleSlider

Я хочу подключить QDoubleSpinBox с QSlider как это:

QObject::connect(ui->myDoubleSpinBox, SIGNAL(valueChanged(double)),
ui->mySlider, SLOT(setValue(double)));
QObject::connect(ui->mySlider, SIGNAL(valueChanged(double)),
ui->myDoubleSpinBox, SLOT(setValue(double)));

Это не будет работать, поскольку QSlider обрабатывает только значения int. Поэтому я думаю, что мне нужно добавить пользовательский слот в QSlider.
Я думал о создании нового класса, производного от QSlider, а затем о реализации слота, например:

QDoubleSlider.hpp

#ifndef QDOUBLESLIDER_H
#define QDOUBLESLIDER_H

#include <QSlider>

class QDoubleSlider : public QSlider
{
Q_OBJECT
public:
explicit QDoubleSlider(QObject *parent = 0);

signals:

public slots:
void setValue(double givenValue);
};

#endif // QDOUBLESLIDER_H

QDoubleSlider.cpp

#include "qdoubleslider.h"
QDoubleSlider::QDoubleSlider(QObject *parent) :
QSlider(parent)
{
}

void QDoubleSlider::setValue(double givenValue)
{
// code
}

Теперь у меня две проблемы:

  1. Компилятор жалуется на неверное преобразование из QObject* в QWidget* в конструкторе.
  2. Я не знаю, как работает setValue, и поэтому я даже не знаю, как реализовать этот слот.

Есть идеи?

0

Решение

  1. parent должен быть QWidget*как говорится в ошибке
  2. Слоты работают как обычные функции-члены. Вы, вероятно, должны хранить точные double в качестве члена и установите соответствующий ползунок в соответствующий целочисленный эквивалент. Не забудьте только отправить valueChanged сигналы, если значение действительно изменяется.

Кроме того, вы, вероятно, должны наследовать от QWidget вместо этого и есть QSlider будучи ребенком, вы не хотите, чтобы пользователи вашего класса изменяли диапазон целых чисел вашего внутреннего слайдера.

0

Другие решения

  1. просто замените ваш QObject на QWidget, потому что конструктор QSlider

    QSlider ( QWidget * parent = 0 )
  2. Вам лучше иметь новый слот с именем setDoubleValue (double данное Value) и подключиться к этому слоту. в этом слоте все просто. лайк

    void QDoubleSlider::setDoubleValue(double givenValue)
    {
    setValue(static_cast<int>(givenValue));
    }
0

По вопросам рекламы [email protected]