5

Qt QMainWindow でユーザーの非アクティブを検出するにはどうすればよいですか? これまでの私の考えは、特定の値が渡された場合にアプリケーションをロックするカウンターをインクリメントする QTimer を用意することです。マウスまたはキーの操作では、タイマーを 0 に戻す必要があります。ただし、リセットされる入力イベントを適切に処理する方法を知る必要があります。私は再実装することができます:

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 に到達するのを妨げませんか? ユーザーアクティビティをそのまま検出するためのより良いアーキテクチャはありますか?

4

2 に答える 2

11

カスタム イベント フィルタを使用して、アプリケーションが受信したすべてのキーボードおよびマウス イベントを子ウィジェットに渡す前に処理できます。

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に感謝します。

于 2010-07-27T08:32:01.687 に答える
0

より良いアプローチの 1 つは、ユーザーからの非常に多くのイベントをキャッチするのではなく、xidle シグナルをキャッチすることです。ここで、QEvent:MouseMove イベントもキャプチャする必要があります

于 2011-02-05T18:55:08.273 に答える