2009-12-20 9 views
29

In meinem Programm möchte ich mouseMoveEvent (QMouseEvent * event) immer dann aufgerufen werden, wenn sich die Maus bewegt (auch wenn es sich über einem anderen Fenster befindet).Erhalten von MouseMoveEvents in Qt

Gerade jetzt, in meiner mainwindow.cpp Datei, die ich habe:

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

Dies scheint aber nur aufgerufen werden, wenn ich die Maus, während sie über das Fenster des Programms selbst klicken und ziehen. Ich habe versucht,

setMouseTracking(true); 

in Mainwindow Konstruktor aufrufen, aber dies scheint nicht, etwas anders zu machen (nur noch mousemove aufgerufen wird, wenn ich eine Maustaste gedrückt halten, unabhängig davon, wo es ist). Was ist der einfachste Weg, die Mausposition global zu verfolgen?

Antwort

32

Sie können einen Ereignisfilter für die Anwendung verwenden.

Definieren und implementieren Sie bool MainWindow :: eventFilter (QObject *, QEvent *). Beispiel:

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

Installieren Sie den Ereignisfilter, wenn die MainWindows erstellt wird (oder anderswo). Zum Beispiel

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

Danke, das funktioniert für kontinuierliche Updates erhalten, wenn die Maus über das Anwendungsfenster ist, aber wenn die Maus woanders bewegt, wird die Position nicht aktualisiert. – Switch

+0

Um die Maus außerhalb des Fensters zu verfolgen, müssen Sie die Maus greifen (siehe QWidget :: grabMouse()). Da alle Mausereignisse an das Widget gesendet werden, das die Maus gegriffen hat, wird eine normale Interaktion mit anderen Widgets verhindert, es sei denn, Sie greifen die Maus nur, wenn die Maus das Fenster verlässt (im leaveEvent()) und lassen Sie dann die Maustaste los auf enterEvent(). – baysmith

+0

Nach dem Hinzufügen von grabMouse() wird es nur aktualisiert, wenn die Maus das Anwendungsfenster passiert – Switch

1

hatte ich das gleiche Problem, weiter durch die Tatsache verschlimmert, dass ich versuche, this->update() rufen Sie das Fenster auf einer Maus bewegen und nichts neu zu zeichnen geschehen würde.

Sie können vermeiden, den Ereignisfilter zu erstellen, indem Sie setMouseTracking(true) aufrufen, wie @Kyberias notiert. Dies muss jedoch auf der vieport, nicht Ihr Hauptfenster selbst erfolgen. (Das gleiche gilt für das Update).

Also in Ihrem Konstruktor können Sie eine Zeile this->viewport()->setMouseTracking(true) hinzufügen und dann mouseMoveEvent überschreiben, anstatt diesen Filter zu erstellen und zu installieren.

+0

Ein QMainWindow hat keine viewport() -Methode. – user1482030