2009-12-20 38 views
29

Trong chương trình của tôi, tôi muốn có sự kiện mouseMoveEvent (sự kiện QMouseEvent *) được gọi bất cứ khi nào con chuột di chuyển (ngay cả khi nó di chuyển qua một cửa sổ khác).Lấy MouseMoveEvents trong Qt

Ngay bây giờ, trong tập tin mainwindow.cpp tôi, tôi có:

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

Nhưng điều này dường như chỉ được gọi khi tôi nhấp và kéo chuột trong khi qua cửa sổ của chương trình riêng của mình. Tôi đã thử gọi

setMouseTracking(true); 

trong constructor MainWindow, nhưng điều này dường như không làm bất cứ điều gì khác nhau (mouseMoveEvent vẫn chỉ được gọi khi tôi giữ nút chuột xuống, bất kể nó ở đâu). Cách dễ nhất để theo dõi vị trí chuột trên toàn cầu là gì?

Trả lời

32

Bạn có thể sử dụng bộ lọc sự kiện trên ứng dụng.

Xác định và triển khai bool MainWindow :: eventFilter (QObject *, QEvent *). Ví dụ:

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

Cài đặt bộ lọc sự kiện khi MainWindows được xây dựng (hoặc một nơi khác). Ví dụ

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

Cảm ơn, nó hoạt động để nhận các bản cập nhật liên tục khi chuột qua cửa sổ ứng dụng, nhưng nếu con chuột di chuyển đến nơi khác, vị trí không cập nhật. – Switch

+0

Để theo dõi con chuột bên ngoài cửa sổ, bạn cần phải lấy con chuột (xem QWidget :: grabMouse()). Vì tất cả các sự kiện chuột sẽ được gửi đến widget đã nắm lấy con chuột, điều này sẽ ngăn cản sự tương tác bình thường với các widget khác, trừ khi bạn chỉ lấy con chuột khi chuột rời khỏi cửa sổ (trong phương thức leaveEvent()) và thả chuột trên enterEvent(). – baysmith

+0

Sau khi thêm grabMouse(), nó vẫn chỉ cập nhật khi chuột đi qua cửa sổ ứng dụng – Switch

1

tôi đã cùng một vấn đề, tiếp tục trầm trọng thêm bởi thực tế là tôi đã cố gắng để gọi this->update() để sơn lại cửa sổ trên một di chuyển chuột và không có gì sẽ xảy ra.

Bạn có thể tránh phải tạo bộ lọc sự kiện bằng cách gọi setMouseTracking(true) như @Kyberias lưu ý. Tuy nhiên, điều này phải được thực hiện trên vieport, không phải chính cửa sổ chính của bạn. (Cùng đi để cập nhật).

Vì vậy, trong nhà xây dựng của bạn, bạn có thể thêm một dòng this->viewport()->setMouseTracking(true) và sau đó ghi đè mouseMoveEvent thay vì tạo bộ lọc này và cài đặt bộ lọc.

+0

QMainWindow không có phương thức viewport(). – user1482030