2013-09-25 2 views
7

Моя проблема заключается в том, что я просто не могу заставить свою QSlider работать с двойными значениями вместо целого числа, потому что мне нужно заставить его возвращать двойные значения в QLineEdit, а также устанавливать собственного значения, когда я вносил некоторое значение в редактирование.Как изменить QSlider с двойными значениями

ответ

5

Когда я был новичком Qt, я начал с this tutorial. Он немного старый (он относится к Qt4.1), но он был достаточно хорош, чтобы начать меня!

Я собрал простое примерное приложение, которое может показать вам, с чего начать ... Возможно, вы сможете найти его полезным!

#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" 
3

Вы можете просто разделить значение ползунка на некоторую константу. Например:

const int dpi = 10; // Any constant 10^n 
int slideVal = 57; // Integer value from slider 
double realVal = double(slideVal/dpi); // float value 
+0

Ну, я видел это решение раньше, и я нашел его самым легким, но мой учитель хотел, чтобы я практиковал сигналы и слоты, поэтому я бы предпочел добавлять пользовательские сигналы и слоты. Но спасибо вам в любом случае! –

+0

@ user2814864 Идея вашего учителя тоже хороша. Вы можете создать свой собственный класс QObject, который будет повторно транслировать сигналы QSlider', но с аргументами 'double'. – vahancho

+0

@ vahancho точно, но проблема в том, что я все еще новичок в программировании и Qt, и у меня нет реальных идей о том, как это сделать. –

Смежные вопросы