2010-11-10 4 views
20

J'utilise un QSlider (v4.6) pour la saisie et pour fournir des commentaires à l'utilisateur. Pour les commentaires j'appellerai la méthode setValue. J'essaye de trouver un signal qui se déclenchera seulement si l'utilisateur a modifié la valeur. Le signal valueChanged se déclenche lorsque l'utilisateur a modifié la valeur ainsi que lorsque j'appelle setValue. sliderMoved ne se déclenche que lorsque l'utilisateur fait glisser le curseur (pas lors de l'utilisation du clavier). J'ai vérifié les documents de l'API et je n'arrive pas à trouver quoi que ce soit. Est-ce que je manque quelque chose? Cela semble quelque chose qui serait commun. S'il n'y a pas d'autre signal, comment recommanderiez-vous que je simule cette fonctionnalité? Dois-je définir un drapeau avant d'appeler setValue, déconnecter et reconnecter le signal chaque fois que j'appelle setValue ...?QSlider Value Changed Signal

+1

Semble toujours valide pour le signal [Qt 5's valueChanged] (http://doc.qt.io/qt-5/qabstractslider.html#valueChanged). – handle

+0

Notez que ['setMinimum()' et 'setMaximum()' (http://doc.qt.io/qt-4.8/qabstractslider.html#minimum-prop) peuvent ajuster la valeur du curseur, en déclenchant le signal valueChanged. – handle

Répondre

32

Bonne question, j'ai vérifié l'API et ne pouvais pas non plus trouver un signal qui serait déclenché uniquement si la valeur était modifiée par l'utilisateur. La solution que vous proposez peut être la seule option, il suffit de garder à l'esprit que vous ne devez pas déconnecter/connecter tous les signaux, il suffit d'utiliser la méthode QObject::blockSignals:

slider->blockSignals(true); 
slider->setValue(x); 
slider->blockSignals(false); 

espoir qui aide.

+1

Merci Pawel! Je ne connaissais pas BlockSignals. Je suppose que cela devra faire. –

+12

Vous voulez probablement stocker la valeur renvoyée par 'blockSignals (true)' et l'utiliser dans le second appel au lieu de 'false'. De cette façon, si un autre code a déjà activé le blocage du signal, vous ne gâcherez pas l'état. (J'espère que ce problème est peu probable, mais le codage défensif est une bonne idée de toute façon.) –

+0

Cette méthode peut être appliquée dans PySide (les bindings python), et j'ai appliqué. Le résultat est comme prévu, sauf pour les signaux définis dans Qt Designer. Si vous connectez un curseur à une barre de progression dans Qt Designer et que vous dites "lorsque la valeur du curseur change, définissez la valeur de la barre de progression", puis bloquez le curseur avant de mettre à jour sa valeur. C'est pourquoi, déconnecter et connecter les signaux est plus approprié. – ceremcem