9
votes

Comment utiliser QcoreApplication :: postEvent pour injecter des événements d'entrée synthétique

Je suis injecté des événements du clavier et de la souris qui se rendent sur le réseau dans mon application Qt et utilisez QcoreApplication :: postEvent code> pour cela. Les coordonnées de la souris sont des coordonnées de pixels d'écran absolue.

QMouseEvent *event = new QMouseEvent(type, QPoint(x, y), mouse_button, mouse_buttons,
    Qt::NoModifier);
QCoreApplication::postEvent(g_qtdraw.main.widget, event);


1 commentaires

Veuillez placer des réponses dans les blocs de réponse. Plus tard, vous pouvez accepter votre propre réponse. Voir aussi Comment accepter un travail de réponse?


3 Réponses :



10
votes

Pouvez-vous utiliser qapplication :: widgettat () pour trouver le widget correct à la position, puis poster à cela? XXX

Je ne m'attendrais pas à ce que vous fassiez cela pour les événements clés. Ils doivent être envoyés au widget ciblé ( qapplication :: focuswidget () ).

Malheureusement, je n'ai pas testé de cela.


1 commentaires

Merci, je l'ai eu pour travailler en utilisant votre allusion. J'ai aussi dû utiliser le récepteur-> Mapfromglobal (POS) pour que les coordonnées soient correctes.



1
votes

Voici la réponse ajoutée à la question:

J'utilise maintenant ce qui suit qui fonctionne bien (merci beaucoup à Dusty Campbell ): P>

QPoint pos(x, y);
QWidget *receiver = QApplication::widgetAt(pos);
if (receiver) {
    QMouseEvent *event = new QMouseEvent(type, receiver->mapFromGlobal(pos),
        mouse_button, mouse_buttons, Qt::NoModifier);
    QCoreApplication::postEvent(receiver, event);
}


1 commentaires

@trenki - Si vous ajoutez votre réponse comme une réponse dans un bloc, veuillez me le faire savoir pour que je puisse supprimer cela. Nous n'avons toujours pas de moyen d'attribuer une réponse au PO pour des situations comme celles-ci.