2017-06-01 2 views
0

Je voudrais connecter un QDoubleSpinBox avec un QSlider horizontal. J'ai trouvé assez d'exemples pour savoir qu'ils nécessitent des types d'arguments différents (double vs int).RÉSOLU. Obtenez le signal émis de la méthode personnalisée. connectez qSlider avec qDoubleSpinBox. Qt. C++

J'ai trouvé que je peux connecter à l'aide de la nouvelle QT5 syntax:

QObject::connect(ui->gammaSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::valueChanged),ui->gammaHSlider, &QSlider::setValue); 
QObject::connect(ui->gammaHSlider, &QSlider::sliderMoved,ui->gammaSpinBox, static_cast<void (QDoubleSpinBox::*)(double)>(&QDoubleSpinBox::setValue)); 

Je sais que pour faire ce bon, je dois convertir leurs arguments respectifs dans les autres par une SLOT/méthode distincte. Alors faites les valeurs int QSlider en double for example:

//connect gamma hSlider to function that will change value to double 
QObject::connect(ui->gammaHSlider, SIGNAL(valueChanged(int)), this, SLOT(notifyValueChanged(int))); 

void MainWindow::notifyValueChanged(int value){ 
     double doubleValue = value/10.0; 
     emit doubleValueChanged(doubleValue); 
     ui->statusbar->showMessage(QString::number(doubleValue)); 
    } 

Ma question ... Comment puis-je obtenir le QDoubleSpinBox de prendre cette nouvelle valeur convertie? Je ne peux pas sembler comprendre comment obtenir la valeur du signal émis doubleValueChanged(doubleValue).

Existe-t-il une façon correcte de faire quelque chose comme ça?

QObject::connect(myQSlider, SIGNAL(doubleValueChanged(double)), myQDoubleSpinBox, SLOT(setValue(double))) 

Quand je mets tout cela ensemble, il semble que QDoubleSpinBox se connecter et synchroniser le mouvement QSlider. Mais il affichera uniquement sa plage de valeurs définie à partir de l'éditeur de l'interface utilisateur.

J'ai besoin de mon boitier et de mon curseur pour augmenter de 0,8 à 4, par incréments de 0,1.

Merci.


Solution:

--- éditeur Ui définir la plage et l'étape de la QDoubleSpinbox et QSlider comme suit:

curseur:

min: 8
max: 50
étape: 1
valeur: 10

qDoubleSpinBox:

min: 0,8
max: 5,0
étape: 0.1
valeur: 1,0

--- relier les deux signaux widgets aux méthodes qui mettent à jour les valeurs:

QObject::connect(ui->gammaHSlider, SIGNAL(valueChanged(int)),this,SLOT(sliderValueChanged(int))); 

QObject::connect(ui->gammaSpinBox, SIGNAL(valueChanged(double)),this,SLOT(spinValueChanged(double))); 

--- fonctions qui mettent à jour les valeurs du curseur et de qdoublespinbox pour correspondre à l'échelle.

void MainWindow::sliderValueChanged(int value){ 
    double mIN = 0.8; 
    double mAX = 5.0; 
    double sTEP = 0.1; 
    ui->gammaHSlider->setMaximum(int (mAX/sTEP)); 
    ui->gammaSpinBox->setDecimals(1); 
    ui->gammaSpinBox->setMinimum(mIN); 
    ui->gammaSpinBox->setMaximum(mAX); 
     double dVal = value*sTEP; 
     ui->gammaSpinBox->setValue(dVal); 
    ui->statusbar->showMessage(QString::number(value)); 
} 

void MainWindow::spinValueChanged(double value){ 
     int sVal = value*10; 
     ui->gammaHSlider->setValue(sVal); 
    ui->statusbar->showMessage(QString::number(value)); 
    } 
+0

Vous souhaitez contrôler les valeurs affichées dans le QDoubleSpinBox de la QSlider, voulez-vous afficher des valeurs de 0,8 à 4 avec une étape de 0,1, soit 0,8 0,9, 1,0 à 3.8, 3.9, 4.0? – eyllanesc

Répondre

1

Si vous souhaitez contrôler les valeurs affichées dans le QDoubleSpinBox de QSlider avec des valeurs de a à b avec pas de s, vous devez placer le nombre d'étapes dans QSlider, configurez également le nombre de chiffres indiqué dans le QDoubleSpinBox, en plus de son minimum et maximum.

double m = 0.8; 
double M = 4.0; 
double s = 0.1; 
myQSlider->setMaximum(int ((M-m)/s)); 
myQDoubleSpinBox->setDecimals(1); 
myQDoubleSpinBox->setMinimum(m); 
myQDoubleSpinBox->setMaximum(M); 
connect(myQSlider, &QSlider::valueChanged, [=](int value){ 
    double val = m + value*s; 
    myQDoubleSpinBox->setValue(val); 
}); 
+0

J'ai ajouté mon code final ci-dessus. Merci pour cela. Cela m'a aidé à comprendre ce que je devais faire. J'ai dû changer vos maths comme note. –