2010-07-27 28 views
5

Làm thế nào tôi có thể phát hiện người dùng không hoạt động trong Qt QMainWindow? Ý tưởng của tôi cho đến nay là có một QTimer tăng bộ đếm, nếu một giá trị nào đó được truyền, hãy khóa ứng dụng. Bất kỳ tương tác chuột hoặc phím nào nên đặt bộ hẹn giờ về 0. Tuy nhiên, tôi cần biết cách xử lý đúng các sự kiện đầu vào được đặt lại; Tôi có thể triển khai lại:Làm thế nào để phát hiện người dùng không hoạt động trong Qt?

virtual void keyPressEvent(QKeyEvent *event) 
virtual void keyReleaseEvent(QKeyEvent *event) 
virtual void mouseDoubleClickEvent(QMouseEvent *event) 
virtual void mouseMoveEvent(QMouseEvent *event) 
virtual void mousePressEvent(QMouseEvent *event) 
virtual void mouseReleaseEvent(QMouseEvent *event) 

... nhưng sẽ không xử lý sự kiện trong tất cả các tiện ích trong QMainWindow? Có kiến ​​trúc nào tốt hơn để phát hiện hoạt động của người dùng không?

Trả lời

7

Bạn có thể sử dụng bộ lọc sự kiện tùy chỉnh để xử lý tất cả các sự kiện bàn phím và chuột mà ứng dụng của bạn nhận được trước khi chúng được chuyển sang tiện ích con.

class MyEventFilter : public QObject 
{ 
    Q_OBJECT 
protected: 
    bool eventFilter(QObject *obj, QEvent *ev) 
    { 
    if(ev->type() == QEvent::KeyPress || 
     ev->type() == QEvent::MouseMove) 
     // now reset your timer, for example 
     resetMyTimer(); 

    return QObject::eventFilter(obj, ev); 
    } 
} 

Sau đó sử dụng một cái gì đó giống như

MyApplication app(argc, argv); 
MyEventFilter filter; 
app.installEventFilter(&filter); 
app.exec(); 

này chắc chắn công trình (Tôi đã thử nó bản thân mình).

CHỈNH SỬA: Và rất cảm ơn ereOn vì đã chỉ ra rằng giải pháp trước đó của tôi không hữu ích lắm.

+0

Hoạt động tuyệt vời, cảm ơn. Tôi đã phát ra tín hiệu với thông số obj nơi bạn có "resetMyTimer" và mỗi cửa sổ đính kèm tín hiệu vào khe hẹn giờ đặt lại, kiểm tra xem tiện ích trên * cửa sổ * đã tạo sự kiện sao cho mỗi cửa sổ khóa độc lập của những người khác. –

+0

Sự kiện này dường như chỉ được gửi đến eventFilter() nếu không có tiện ích con nào xử lý sự kiện đó. Có cách nào để đảm bảo tất cả các sự kiện đi tới bộ lọc này trước khi được xử lý ở nơi khác không? – KyleL

0

Một trong những cách tiếp cận tốt hơn là bắt tín hiệu xidle thay vì thu hút rất nhiều sự kiện từ người dùng. Ở đây một trong những cần phải nắm bắt QEvent: sự kiện MouseMove cũng

Các vấn đề liên quan