J'ai implémenté un widget rotatif dans Qt. Lorsque l'utilisateur clique sur le bouton rotatif, le curseur de la souris est caché, et en glissant la souris vers la gauche/bas, le bouton rotatif tourne dans le sens inverse des aiguilles d'une montre, et en glissant la souris vers la droite/haut, le bouton rotatif tourne dans le sens des aiguilles d'une montre. Lorsque la souris est relâchée, le curseur reprend la position initiale du clic. Implémenté de cette manière :
void RotaryWidget::mousePressEvent(QMouseEvent *MouseEvent)
{
mMousePos = QCursor::pos();
mPreviousPos = MouseEvent->pos();
setCursor(Qt::BlankCursor);
}
void RotaryWidget::mouseReleaseEvent(QMouseEvent *MouseEvent)
{
QCursor::setPos(mMousePos);
unsetCursor();
}
void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
// Use DeltaPos to move my rotary
mPreviousPos = MouseEvent->pos();
}
L'avantage est que lorsqu'il y a plusieurs rotatives à la suite, il est plus rapide pour l'utilisateur d'effectuer des ajustements.
Le code ci-dessus présente un problème : si le curseur atteint le bord de l'écran, la souris ne peut pas être déplacée et le bouton rotatif ne bouge donc pas. Cependant, l'utilisateur ne peut pas voir le curseur, c'est donc un problème. J'ai modifié mouseMoveEvent
pour le réparer :
void RotaryWidget::mouseMoveEvent(QMouseEvent *MouseEvent)
{
if(MouseEvent->globalPos() == mMousePos)
{
mPreviousPos = mapFromGlobal(mMousePos);
return;
}
else
{
QCursor::setPos(mMousePos);
}
QPoint DeltaPos = MouseEvent->pos() - mPreviousPos;
// Use DeltaPos to move my rotary
mPreviousPos = MouseEvent->pos();
}
Essentiellement, chaque fois que la souris est déplacée, le changement est calculé, puis le curseur est ramené à la position de pression initiale (il ne peut donc jamais sortir de l'écran). Les if
en haut de la page permet de s'assurer que la position de la souris n'est pas continuellement ramenée à la position d'origine.
Cela fonctionne bien sur les appareils à écran non tactile, mais pas sur les appareils à écran tactile, QCursor::setPos()
ne fonctionne pas car je ne peux pas programmer la position d'un doigt sur un écran !
Je n'ai pas trouvé de solution qui réponde à toutes les exigences que j'ai décrites. S'il existait un moyen de détecter si l'utilisateur se sert d'un écran tactile, cela pourrait être corrigé, mais je n'ai trouvé aucune fonction de ce type dans Qt.