Question

J'ai un QWidget qui gère le événement de souris , c'est-à-dire qu'il stocke la position de souris dans une liste lorsque le bouton gauche de la souris est enfoncé. Le problème est que je ne peux pas dire au widget de ne prendre qu'un point toutes les x ms.

Quel serait le moyen habituel d’obtenir ces échantillons?

Éditer: étant donné que l'appel mouseevent n'est pas appelé très souvent, est-il possible d'augmenter le débit?

Était-ce utile?

La solution

On dirait que vous ne voulez pas du tout la gestion des événements asynchrones, vous voulez juste obtenir l'emplacement du curseur à intervalles fixes.

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

Si vous ne souhaitez faire cela que lorsque le bouton gauche de la souris est enfoncé, utilisez mousePressEvent () et mouseReleaseEvent () pour démarrer / arrêter le chronomètre.

Autres conseils

Vous avez deux choix. Vous pouvez soit mettre une 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 la période appropriée est passée.

(c’est la mauvaise manière). Vous pouvez également toujours avoir un processus quelque part dans votre application qui enregistre le gestionnaire d’événements toutes les x millisecondes (s’il ne l’est pas déjà enregistré) et que votre gestionnaire d’événements ne se désinscrit pas pour cet événement. dans votre gestionnaire). Ainsi, lorsque l'événement se produit, le gestionnaire d'événements n'est plus enregistré et le temporisateur se réenregistre pour l'événement à l'intervalle spécifié.

Vous pouvez ajouter un QTimer à un coup connecté à un emplacement définissant un booléen sur true et modifier l'emplacement de votre événement de souris pour qu'il vérifie d'abord que l'objet est vrai et que, s'il est défini sur false, effectuez une vérification. le code que vous alliez normalement faire, puis, à la fin, configurez QTimer à déclenchement unique pour qu'il s'éteigne dans x ms.

Filtrez-le. 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 vous utilisez par hasard une connexion en file d'attente avec OnMouseEvent (si le fil est différent, peu probable dans votre cas), utilisez un emplacement de proxy connectant directement le signal intéressant, filtrez à l'intérieur et émettez ensuite le signal que vous vous connectez en file d'attente à. Sinon, vous pourriez spammer sans le savoir la boucle d’événements.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top