2012-01-04 13 views
5

Wprowadzam iniekcje klawiatury i myszy, które przechodzą przez sieć do mojej aplikacji Qt i używam do tego celu QCoreApplication::postEvent. Współrzędne myszy są absolutnymi współrzędnymi pikseli ekranu.Jak używać QCoreApplication :: postEvent do wstrzykiwania zdarzeń wejścia syntetycznego

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

Początkowo miałem tylko jeden widżet (nawiązując do g_qtdraw.main.widget), więc wystarczy, że jeden używany jako argument odbiornik do postEvent. Teraz moja aplikacja ma więcej niż jeden widżet, a powyższy kod nie robi już tego, czego chcę.

Drugi widget jest wyświetlany w trybie pełnoekranowym i wiem, że wszystkie zdarzenia myszy muszą przejść do tego okna, ale z powyższym kodem są nadal kierowane do głównego widgetu.

Jak wybrać właściwy widżet jako odbiornik (ten pod myszką x, y coords)? Czy istnieje standardowy sposób, aby Qt wybrał odpowiedni widget lub czy muszę go sam śledzić?

edit

teraz używać następujących składników, które działa dobrze (wiele dzięki 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); 
} 

Odpowiedz

8

można używać QApplication::widgetAt() aby znaleźć odpowiedni widget na miejsce, a następnie dodawać do tego?

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

Nie spodziewałbym się jednak, że będziesz musiał to zrobić dla kluczowych wydarzeń. Powinny być wysyłane do skoncentrowanego widżetu (QApplication::focusWidget()).

Niestety, nie przetestowałem żadnego z tego.

+0

Dzięki, mam to do pracy przy użyciu podpowiedzi. Musiałem również użyć odbiornika-> mapFromGlobal (pos), aby współrzędne były poprawne. – trenki

3

Proponuję opublikowania kodu jak według documentation podpis jest:

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

Mam próbowałeś podać wskaźnik do odpowiedniego argumentu QObject jako argumentu receiver?

(edit: nuta że QWidget dziedziczy QObject)

+0

Dodałem nowe informacje. Kiedy mam więcej niż jedno okno/widget, jak wybrać właściwy (ten pod myszką x, y)? – trenki

+0

Ach, przegapiłeś kluczowe informacje o tym, jak chcesz zdecydować o widżecie;) –

Powiązane problemy