2009-12-20 15 views
29

W moim programie chciałbym wywołać mouseMoveEvent (QMouseEvent * event) za każdym razem, gdy mysz się porusza (nawet gdy jest nad innym oknem).Uzyskiwanie MouseMoveEvents w Qt

Teraz, w moim pliku mainwindow.cpp, mam:

void MainWindow::mouseMoveEvent(QMouseEvent* event) { 
    qDebug() << QString::number(event->pos().x()); 
    qDebug() << QString::number(event->pos().y()); 
} 

Ale to wydaje się być wywołana tylko po kliknięciu i przeciągnij myszą, podczas gdy nad oknem samego programu. Próbowałem nazywając

setMouseTracking(true); 

w konstruktorze MainWindow, ale to nie wydaje się, aby zrobić coś inaczej (mouseMoveEvent nadal jest wywoływana tylko kiedy przytrzymaj przycisk myszy, niezależnie od tego, gdzie to jest). Jaki jest najłatwiejszy sposób śledzenia pozycji myszy na całym świecie?

Odpowiedz

32

Możesz użyć filtru zdarzeń w aplikacji.

Definiowanie i wdrażanie Bool MainWindow :: eventFilter (QObject *, QEvent *). Na przykład:

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::MouseMove) 
    { 
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); 
    statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y())); 
    } 
    return false; 
} 

Zainstaluj filtr zdarzeń po zbudowaniu MainWindows (lub w innym miejscu). Na przykład

MainWindow::MainWindow(...) 
{ 
    ... 
    qApp->installEventFilter(this); 
    ... 
} 
+1

Dziękujemy, że działa w celu uzyskania ciągłych aktualizacji, gdy mysz znajduje się nad oknem aplikacji, ale jeśli mysz zostanie przeniesiona gdzie indziej, pozycja nie zostanie zaktualizowana. – Switch

+0

Aby śledzić mysz za oknem, musisz złapać mysz (zobacz QWidget :: grabMouse()). Ponieważ wszystkie zdarzenia myszy będą wysyłane do widgetu, który złapał mysz, uniemożliwi to normalną interakcję z innymi widżetami, chyba że pobierzesz mysz tylko wtedy, gdy mysz opuści okno (w funkcji leaveEvent()), a następnie zwolnij mysz na enterEvent(). – baysmith

+0

Po dodaniu metody grabMouse(), wciąż aktualizuje się tylko wtedy, gdy mysz przechodzi nad oknem aplikacji. – Switch

1

miałem ten sam problem, dodatkowo pogarsza fakt, że próbował zadzwonić this->update() do odświeżenia okna na ruch myszy i nic się nie stanie.

Można uniknąć konieczności tworzenia filtru zdarzeń, dzwoniąc pod numer setMouseTracking(true), tak jak zaznaczono @Kyberias. Trzeba to jednak zrobić na vieportie , a nie na samym oknie głównym. (To samo dotyczy aktualizacji).

W swoim konstruktorze można dodać linię this->viewport()->setMouseTracking(true), a następnie zastąpić mouseMoveEvent zamiast tworzyć ten filtr i instalować go.

+0

QMainWindow nie ma metody viewport(). – user1482030