2009-07-31 4 views
0

J'ai un QWidget qui gère le mouseevent, c'est-à-dire qu'il stocke le mouseposition dans une liste lorsque le bouton gauche de la souris est pressé. Le problème est, je ne peux pas dire au widget de prendre seulement un point toutes les x ms.Comment acquérir un événement uniquement à des moments définis?

Quelle serait la manière habituelle d'obtenir ces échantillons?

Modifier: depuis le mouseevent n'est pas appelé très souvent, est-il possible d'augmenter le taux?

+0

Si vous pouviez dire pourquoi vous pensez devoir limiter les événements de la souris, nous pourrions vous aider à mieux vous servir. Si vous regardez l'exemple de scribblearea dans la distribution Qt, et que vous déplacez votre souris très rapidement, vous verrez qu'il peut y avoir une distance de plus de 100 pixels entre deux événements de souris, donc le taux semble être faible pour commencer. –

+0

Je voudrais l'utiliser, pour simuler/tester les signaux reçus d'une source de données (capteur). C'est plus facile à faire avec une souris pour faire quelques tests. – Burkhard

Répondre

3

Il semble que vous ne souhaitiez pas du tout la gestion d'événements asynchrones, vous voulez juste obtenir l'emplacement du curseur à intervalles fixes.

Configurer une minuterie à déclencher toutes les x millisecondes. Connectez-le à un emplacement qui obtient la valeur QCursor::pos(). Utilisez QWidget::mapFromGlobal() si vous avez besoin de la position du curseur dans les coordonnées locales de votre widget.

Si vous ne souhaitez effectuer cette opération que lorsque le bouton gauche de la souris est enfoncé, utilisez mousePressEvent() et mouseReleaseEvent() pour démarrer/arrêter le temporisateur.

+0

C'est exactement ce dont j'avais besoin. Merci. – Burkhard

1

Vous avez deux choix. Vous pouvez soit mettre une certaine logique dans le gestionnaire d'événements qui stocke l'horodatage (en millisecondes) du dernier événement. Vous vérifiez ensuite cet horodatage avec chaque événement et ne stockez le point que si le délai approprié s'est écoulé.

Vous pouvez toujours avoir un processus quelque part dans votre application qui enregistre le gestionnaire d'événements toutes les x millisecondes (si elle n'est pas déjà enregistrée), puis que votre gestionnaire d'événements se désinscrit pour le événement dans votre gestionnaire). De cette façon, lorsque l'événement se produit, le gestionnaire d'événements n'est pas enregistré et la minuterie se réinscrit pour l'événement à l'intervalle spécifié.

1

Vous pouvez ajouter un QTimer à simple tir qui est connecté à un emplacement qui définit un booléen à true, et modifier l'emplacement d'événement de votre souris pour vérifier que booléen est vrai et s'il est défini sur false, faites le code que vous étiez en train de faire normalement, puis à la fin, réglez le QTimer à impulsion unique sur x ms.

1

Filtrer. Ignorez simplement toutes les entrées (ne les mettez pas dans la liste) à moins que x ms ne soit passé.

QTime m_time; // member of your class 
int m_interval = 100; // ms 

void MyWidget::StartCapturing() 
{ 
    m_time.start(); 
} 

void MyWidget::OnMouseEvent(...) 
{ 
    if(m_time.elapsed() < m_interval) 
     return; 

    // process event 

    m_time.reset();   
} 

EDIT: Si par hasard vous utilisez une connexion en file d'attente à OnMouseEvent (si elle est différente du fil, peu probable dans votre cas), utilisez une fente de proxy directement connecté le signal intéressant, filtre à l'intérieur et n'émettent alors signalez que vous vous connectez en file d'attente. Dans le cas contraire, vous risquez de spammer la boucle d'événements sans le vouloir.

+0

Les événements de souris ne sont pas fournis avec les connexions signal/emplacement, mais avec la méthode virtuelle 'QWidget :: mouseEvent()'. Votre idée générale est correcte, cependant. –

0

Utilisez une minuterie au lieu d'événements.

Questions connexes