2009-08-02 12 views
4

Je travaille sur un programme de peinture simple. Il semblait que Qt (et KDE) serait un moyen facile de l'implémenter. Je trouve Qt assez facile à utiliser, mais maintenant j'ai rencontré un problème.Qt, souris sautant, ne pas mettre à jour chaque pixel, mouseMoveEvent()

Lorsque je dessine quelque chose dans mon programme, la souris saute si je déplace la souris trop rapidement.

comme ceci:
alt text
Il susposed être comme une longue chaîne. J'utilise mouseMoveEvent() pour dessiner un pixel sur mon image lorsque le bouton gauche de la souris est enfoncé. J'ai appelé setMouseTracking (true); donc l'événement devrait être appelé aussi longtemps que je bouge la souris.

void camoMaker::mouseMoveEvent(QMouseEvent *ev) 
{ 
    if(ev->state()==Qt::LeftButton) 
    { 
     QPoint mPoint=ev->pos(); 
     mPoint.setX(mPoint.x()-80); 
     drawPoint(mPoint); 
    } 
} 

camoMaker est le widget principal. DrawPoint() dessine un pixel sur une QImage interne et utilise QPainter sur un QWidget qui est la zone de dessin.

Il me semble que soit mouseMoveEvent() n'est pas appelé pour chaque pixel que la souris déplace ou que la souris saute effectivement un pixel. Je comprends qu'il pourrait juste comment cela fonctionne et pas Qt faute mais X11 ou comment le système d'exploitation gère la position/entrée de la souris.

Si oui, comment dois-je faire pour le réparer, devrais-je essayer d'interpoler à partir de 2 points qui est enregistré?

Répondre

13

Les événements de souris ne se produisent pas pour chaque pixel lorsque la souris se déplace sur la plupart des systèmes d'exploitation. Les gestionnaires de messages (y compris KDE/linux) affichent à plusieurs reprises les mouvements de la souris, mais les pixels sont souvent ignorés.

Vous devez suivre l'emplacement du dernier pixel et tracer une ligne ou ajouter des points supplémentaires entre la dernière position et la position actuelle.

3

Vous avez raison - les systèmes de fenêtrage ne fournissent pas d'événement de déplacement de la souris pour chaque pixel. Vous devez interpoler une ligne entre les pixels pour lesquels vous obtenez des événements.