2012-01-09 8 views
5

voglio collegare un QSlider a un QDoubleSpinBox ma mentre il codice compila bene e funziona per semplice QSpinBox, non funziona per QDoubleSpinBoxCome collegare una 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))); 

risposta

6

QSlider e QDoubleSpinBox prendere diversa tipi di argomenti in valueChanged/setValue (QSlider utilizza ints e QDoubleSpinBox utilizza i doppi, ovviamente). Modifica del tipo di argomento per il segnale del dispositivo di scorrimento e lo slot potrebbe aiutare:

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

io non sono sicuro se Qt in grado di gestire automaticamente questo tipo di conversione per voi; in caso contrario, dovrai definire i tuoi slot per chiamare setValue() sull'oggetto corretto

+1

Non, non ci può essere conversioni sensibili che hanno senso in entrambe le direzioni (slider-> casella di selezione, girare box-> cursore). Avrà bisogno di slot personalizzati per la corretta mappatura dei valori. –

7

Dovrai aggiungere il tuo slot che converte il tipo di argomento ed emette un segnale o aggiorna direttamente il cursore.

+0

Grazie, ci proverò, ma sembra strano che nessuno l'abbia ancora fatto ... Penso che sia una cosa molto comune ... – linello

3

Come ha risposto Dave Kilian, i segnali e gli slot per QSlider non utilizzano il doppio. Inoltre, Qt 4 non converte automaticamente i tipi; non ti permetterà di connetterli. Quindi, dovrai scrivere il tuo slot di conversione che aggiorna il valore dell'altro elemento.

1

Spero che questo potrebbe aiutare.

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