QSlider souris saut direct
Au lieu de monter lorsque l'utilisateur clique sur le qslider je veux faire le curseur saute à cette position. Comment cela peut-il être mis en œuvre ?
- Voir Micka réponse ci-dessous à la place de la accepté de répondre pour une solution simple.
- Notez que le comportement par défaut du curseur de la plate-forme. Sur MacOS par exemple, le curseur saute directement à l'endroit où le clic de la souris a été.
InformationsquelleAutor Vihaan Verma | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Bien, je doute que Qt est une fonction directe à cet effet.
Essayez d'utiliser des widgets personnalisés. Cela devrait fonctionner!
Essayer la logique suivante
setValue(minimum() + (maximum() - minimum()) * (static_cast<float>(event->x()) / static_cast<float>(width())));
après avoir eu des problèmes avec toutes les versions de @spyke @Massimo Callegari et @Ben (la position du curseur n'était pas correct pour l'ensemble de la zone), j'ai trouvé quelques Qt fonctionnalité de Style à l'intérieur de QSlider source:
QStyle::SH_Slider_AbsoluteSetButtons
.Vous devez créer un nouveau QStyle qui peut être très ennuyeux, ou vous utilisez
ProxyStyle
comme indiqué par l'utilisateur jpn dans http://www.qtcentre.org/threads/9208-QSlider-step-customize?p=49035#post49035J'ai ajouté un autre constructeur et correction d'une faute de frappe, mais il a utilisé le reste du code source d'origine.
maintenant, vous pouvez définir le style de votre curseur dans la boîte de constructeur (si votre curseur est dérivé de QSlider):
ou il devrait fonctionner de cette façon, si c'est un standard QSlider:
si vous utilisez le style original de cet élément, mais si le
QStyle::SH_Slider_AbsoluteSetButtons
de "propriété" est demandé de vous retourner que vous le souhaitez 😉peut-être que vous devrez détruire ces proxystyles sur le curseur de la suppression, pas encore testé.
QProxyStyle
constructeur que certains constructeurs sont cachés, donc je devais le définir explicitement comme ceci:MyStyle(QStyle* style = nullptr) : QProxyStyle(style) {}
J'avais besoin de ce trop et essayé spyke solution, mais il manque deux choses:
Alors, voici la revue de code:
event
à la classe de base, si la position spéciale qui a été fait.La réponse de Massimo Callegari est presque droit, mais le calcul de newVal ignore la poignée du curseur de largeur. Ce problème se produit lorsque vous essayez de cliquer près de l'extrémité de la tige.
Le code suivant résout ce pour les curseurs horizontaux
Ici est une mise en œuvre simple en python à l'aide de QStyle.sliderValueFromPosition():
Le code suivant est en fait un hack, mais il fonctionne très bien sans sous-classement QSlider. La seule chose que vous devez faire est de connecter QSlider signal valueChanged à votre conteneur.
Note1: Vous devez définir un pageStep > 0 dans votre curseur
Note2: Il ne fonctionne que pour une horizontale, de gauche à droite du curseur (vous devez modifier le calcul de la "sliderPosUnderMouse" de travailler avec orientation verticale ou inversé apparence)
Mon final de mise en œuvre basé sur les commentaires:
Je pense,
la QStyle::sliderValueFromPosition() la fonction peut être utilisée.
http://qt-project.org/doc/qt-5/qstyle.html#sliderValueFromPosition
j'ai essayé de les rechercher et de ce sur le net et m'attendais à Qt pour une manière plus intelligente à faire cela, malheureusement, il n'était pas d'une grande aide (peut être que j'étais pas à la recherche correctement )
bien j'ai fait ça dans Qt creator:
ui->HSlider->installEventFilter(ce);
Dans le defination :
un. vérifier si l'objet est de votre curseur, tapez quelque chose comme :
ui->HSlider == Object
b. Vérifier la souris cliquez sur l'événement quelque chose comme :
QEvent::MouseButtonPress == event->type
c. si le au-dessus de toutes les passes signifie u ai événement de souris sur le curseur de faire quelque chose comme : définition :
ui->HSlider->setValue( Qcursor::pos().x() - firstval ); return QMainWindow::eventFilter(object, event);
Remarque: fistVal : peuvent être prises par l'impression de la cursur la position à 0 = position initiale du curseur ( avec l'aide de
QCursor::pos().x()
)espère que cette aide
Une méthode simple serait de dériver de
QSlider
et réimplémentermousePressEvent(....)
pour définir la position du repère à l'aide desetSliderPosition(int)
.J'ai également rencontré ce problème. Ma solution est illustré ci-dessous.
Vous pouvez également remplacer ces gestionnaires d'événements de QSlider.
QSlider::mousePressedEvent
QSlider::mouseMoveEvent
QSlider::mouseDoubleClickEvent
Cette modification à la JumpSlider ci-dessus fonctionne PyQt5: