2012-01-04 9 views
5

Estoy inyectando eventos de teclado y mouse que están llegando a través de la red en mi aplicación Qt y uso QCoreApplication::postEvent para esto. Las coordenadas del mouse son coordenadas absolutas de píxeles de pantalla.Cómo utilizar QCoreApplication :: postEvent para inyectar eventos sintéticos de entrada

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

Inicialmente acababa de un widget (referenciado por g_qtdraw.main.widget) por lo que simplemente usado que uno como el argumento receptor para postEvent. Ahora mi aplicación tiene más de un widget y el código anterior ya no hace lo que quiero.

Se muestra un segundo widget en modo de pantalla completa y sé que todos los eventos del mouse tienen que ir a esta ventana, pero con el código anterior todavía se enrutan al widget principal.

¿Cómo elijo el widget correcto como el receptor (el que está debajo del mouse x, y coords)? ¿Hay una forma estándar, para que Qt elija el widget correcto o tengo que rastrearlo yo mismo?

edición

ahora el uso de los siguientes elementos que funciona bien (Muchas gracias a Dusty Campbell):

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); 
} 

Respuesta

8

Se puede utilizar QApplication::widgetAt() para encontrar el widget correcta en la posición y luego enviar a eso?

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

Sin embargo, no esperaría que tuvieras que hacer esto para los eventos clave. Deben enviarse al widget enfocado (QApplication::focusWidget()).

Desafortunadamente, no he probado nada de esto.

+0

Gracias, lo hice funcionar con tu pista. También tuve que usar el receptor-> mapFromGlobal (pos) para que las coordenadas fueran correctas. – trenki

3

Yo sugeriría publicar algo de código como de acuerdo con la documentation la firma es:

void QCoreApplication::postEvent (QObject * receiver, QEvent * event) [static] 

Have ¿intentó dar un puntero al QObject correspondiente como el argumento receiver?

(edición: nota que QWidget hereda QObject)

+0

He agregado nueva información. Cuando tengo más de una ventana/widget, ¿cómo elijo el correcto (el que está debajo del mouse x, y)? – trenki

+0

Ah, perdiste la información clave sobre cómo querías decidir el widget;) –

Cuestiones relacionadas