Qt: Создание QDoubleSlider

Я хочу подключить ************** с QSlider следующим образом:

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

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

#ifndef QDOUBLESLIDER_H
#define QDOUBLESLIDER_H

#include <qslider>

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

signals:

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

#endif // QDOUBLESLIDER_H
</qslider>

*************.cpp

#include "q******slider.h"

*************::*************(QObject *parent) :
 QSlider(parent)
{
}

void *************::setValue(****** givenValue)
{
 // code
}

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

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

Есть идеи?

2 ответа

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

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


  1. просто замените QObject на QWidget, потому что конструктор QSlider ( QWidget * parent = 0 ) - QSlider ( QWidget * parent = 0 )
  2. вам лучше иметь новый слот с именем ************** (****** givenValue) и подключиться к этому слоту. в этом слоте это просто. как void *************::**************(****** givenValue) { setValue(static_cast<int>(givenValue)); }</int> void *************::**************(****** givenValue) { setValue(static_cast<int>(givenValue)); }</int>

licensed under cc by-sa 3.0 with attribution.