2010-07-27 5 views
5

Qt QMainWindow에서 사용자 비활성을 어떻게 감지합니까? 지금까지 내 생각은 특정 값이 전달되면 응용 프로그램을 잠그는 카운터를 증가시키는 QTimer를 갖는 것입니다. 어떤 마우스 또는 키 상호 작용은 타이머를 다시 0으로 설정해야합니다. 그러나 재설정 된 입력 이벤트를 올바르게 처리하는 방법을 알아야합니다. 나는 구현-다시 할 수 있습니다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) 

을 ...하지만 QMainWindow의 모든 위젯의 이벤트 핸들러는 QMainWindow의 도달에서 이러한 컨트롤에서 발생하는 이벤트를 방지 할 수 없습니다? 거기에 사용자 활동을 감지하기위한 더 나은 아키텍처가 있습니까?

답변

7

응용 프로그램에서 수신 한 모든 키보드 및 마우스 이벤트를 사용자 위젯에 전달하기 전에 사용자 정의 이벤트 필터를 사용하여 하위 위젯에 전달할 수 있습니다.

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

그런 다음이 확실히 작동

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

같은 것을 사용 (내가 직접 시도했습니다).

편집 : 내 이전 솔루션은별로 유용하지 않았 음을 지적하는 ereOn에게 감사드립니다.

+0

대단히 감사합니다. 나는 당신이 "resetMyTimer"를 가진 obj 매개 변수를 가지고 신호를 내보내는 것을 끝내고 각 윈도우가 그 윈도우의 위젯이 이벤트를 생성했는지를 검사하는 리셋 타이머 슬롯에 신호를 첨부하여 각 윈도우를 독립적으로 잠급니다 다른 사람들의 –

+0

자식 위젯이 해당 이벤트를 처리하지 않는 경우에만 이벤트가 eventFilter()로 보내집니다. 모든 이벤트가 다른 곳에서 처리되기 전에이 필터로 이동하도록하는 방법이 있습니까? – KyleL

0

더 나은 방법 중 하나는 사용자로부터 많은 이벤트를 포착하는 대신 xidle 신호를 포착하는 것입니다. 여기에 QEvent를 캡처해야합니다 : MouseMove 이벤트

관련 문제