2009-12-20 4 views
29

내 프로그램에서는 마우스가 움직일 때마다 (심지어 다른 창 위에있을 때도) mouseMoveEvent (QMouseEvent * 이벤트)를 호출하고 싶습니다.Qt에서 MouseMoveEvents 얻기

는 지금, 내 mainwindow.cpp 파일에서, 내가 가진 :

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

하지만 클릭하고 프로그램 자체의 창 위로 상태에서 마우스를 드래그하는 경우에만 호출 할 것으로 보인다. 나는 MainWindow를 생성자에서

setMouseTracking(true); 

를 호출 시도했다, 그러나 이것은 (나는 아래로 마우스 버튼을 누르고 있으면 mouseMoveEvent가 여전히 호출에 관계없이이 곳의) 다른 아무것도하지 않는 것. 전 세계적으로 마우스 위치를 추적하는 가장 쉬운 방법은 무엇입니까?

답변

32

응용 프로그램에서 이벤트 필터를 사용할 수 있습니다.

bool MainWindow :: eventFilter (QObject *, QEvent *)를 정의하고 구현합니다. 예를 들어,

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

MainWindows가 구성 될 때 (또는 다른 곳에서) 이벤트 필터를 설치하십시오. 예를

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

감사합니다. 마우스가 응용 프로그램 창 위에있을 때 지속적인 업데이트를 얻을 수 있지만 마우스가 다른 곳으로 이동하면 위치가 업데이트되지 않습니다. – Switch

+0

창 밖에서 마우스를 추적하려면 마우스를 가져와야합니다 (QWidget :: grabMouse() 참조). 모든 마우스 이벤트는 마우스를 움켜 잡은 위젯으로 보내 지므로, 마우스가 창을 떠날 때 (leaveEvent())에만 마우스를 잡은 다음 마우스를 놓지 않으면 다른 위젯과의 일반적인 상호 작용을 막을 수 있습니다 on enterEvent(). – baysmith

+0

grabMouse()를 추가 한 후에도 마우스가 응용 프로그램 창 위로 이동할 때만 계속 업데이트됩니다. – Switch

1

위해 나는 더 나는 마우스 이동 및 일어날 아무것도에 창을 다시 칠하는 this->update()를 호출하려고했다는 사실에 의해 악화 같은 문제가 있었다.

@Kyberias가 언급 한대로 setMouseTracking(true)을 호출하여 이벤트 필터를 작성하지 않아도됩니다. 그러나이 작업은 vieport에서 수행해야하며 기본 창 자체에서는 수행하지 않아야합니다. (같은 업데이 트를 간다).

생성자에서이 필터를 만들고 설치하는 대신 this->viewport()->setMouseTracking(true) 줄을 추가 한 다음 mouseMoveEvent을 재정의 할 수 있습니다.

+0

QMainWindow에는 viewport() 메서드가 없습니다. – user1482030