2012-01-09 11 views
5

Quiero conectar un QSlider a un QDoubleSpinBox pero mientras el código se compila bien y tiene una duración de QSpinBox sencilla, no funciona para QDoubleSpinBoxCómo conectar un QSlider a 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))); 

Respuesta

6

QSlider y QDoubleSpinBox tomar diferentes tipos de argumentos en valueChanged/setValue (QSlider usa ints y QDoubleSpinBox usa dobles, por supuesto). Cambiar el tipo de argumento a favor de la señal y la ranura de la corredera podría ayudar:

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

no estoy seguro de si Qt puede manejar de forma automática el tipo de conversión para usted; si no, tendrá que definir sus propios espacios para llamar a setValue() en el objeto correcto

+1

No, no puede haber conversiones sensatas que tengan sentido en ambos sentidos (control deslizante-> cuadro de giro, cuadro de giro-> control deslizante). Necesitará ranuras personalizadas para el mapeo correcto de valores. –

7

Tendrá que agregar su propia ranura que convierta el tipo de argumento y emita una señal o actualice el control deslizante directamente.

+0

Gracias, lo intentaré, pero parece extraño que nadie lo haya hecho todavía ... Creo que es algo muy común ... – linello

3

Como respondió Dave Kilian, las señales y ranuras para QSlider no usan doble. Además, Qt 4 no convierte automáticamente los tipos; no te permitirá conectarlos. Por lo tanto, deberá escribir su propia ranura de conversión que actualice el valor del otro elemento.

1

Hope esto podría ayudarle.

#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" 
Cuestiones relacionadas