2012-01-04 14 views
5

Sto iniettando eventi di tastiera e mouse che stanno entrando nella rete nella mia applicazione Qt e uso QCoreApplication::postEvent per questo. Le coordinate del mouse sono le coordinate assolute dello schermo.Come utilizzare QCoreApplication :: postEvent per iniettare eventi di input sintetici

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

Inizialmente ho avuto solo un widget (a cui fa riferimento g_qtdraw.main.widget) quindi ho semplicemente usato che uno come argomento ricevitore postEvent. Ora la mia applicazione ha più di un widget e il codice sopra non fa quello che voglio più.

Un secondo widget è mostrato in modalità schermo intero e so che tutti gli eventi del mouse devono andare in questa finestra ma con il codice sopra sono ancora indirizzati al widget principale.

Come scegliere il widget corretto come ricevitore (quello sotto il mouse x, y coords)? Esiste un modo standard, in modo che Qt scelga il widget giusto o devo farlo da solo?

modificare

io uso i seguenti che funziona bene (Molte grazie 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); 
} 

risposta

8

Potete utilizzare QApplication::widgetAt() per trovare il widget di corretto nella posizione e poi inviare a questo?

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

Non mi aspetterei che si debba fare questo per gli eventi chiave. Devono essere inviati al widget focalizzato (QApplication::focusWidget()).

Sfortunatamente, non ho provato nulla di tutto questo.

+0

Grazie, ho avuto modo di lavorare usando il tuo suggerimento. Ho anche dovuto usare receiver-> mapFromGlobal (pos) affinché le coordinate fossero corrette. – trenki

3

Vorrei suggerire la pubblicazione del codice, come secondo il documentation la firma è:

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

Avere hai provato a dare un puntatore al corrispondente QObject come argomento receiver?

(edit: nota che QWidget eredita QObject)

+0

Ho aggiunto nuove informazioni. Quando ho più di una finestra/widget, come faccio a scegliere quello giusto (quello sotto il mouse x, y)? – trenki

+0

Ah, hai perso le informazioni chiave su come volevi decidere il widget;) –

Problemi correlati