web-dev-qa-db-ja.com

QtでMouseMoveEventsを取得する

私のプログラムでは、マウスが移動するたびに(別のウィンドウ上にある場合でも)mouseMoveEvent(QMouseEvent *イベント)が呼び出されるようにします。

今、私のmainwindow.cppファイルには、次のものがあります。

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

しかし、これは、プログラム自体のウィンドウ上でマウスをクリックしてドラッグしたときにのみ呼び出されるようです。電話してみた

setMouseTracking(true);

mainWindowのコンストラクターで、しかし、これは何も違うようには見えません(mouseMoveEventは、マウスボタンを押したときに、どこにいても呼び出されます)。マウスの位置をグローバルに追跡する最も簡単な方法は何ですか?

31
Switch

アプリケーションでイベントフィルターを使用できます。

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);
  ...
}
34
baysmith

私は同じ問題を抱えていましたが、this->update()を呼び出してマウスの動きでウィンドウを塗り直そうとしても何も起こらないという事実によってさらに悪化しました。

@Kyberiasで述べたようにsetMouseTracking(true)を呼び出すことで、イベントフィルターを作成する必要がなくなります。ただし、これは、メインウィンドウ自体ではなく、vieportで行う必要があります。 (アップデートにも同じことが言えます)。

したがって、コンストラクターでthis->viewport()->setMouseTracking(true)行を追加し、このフィルターを作成してインストールするのではなく、mouseMoveEventをオーバーライドできます。

3
darda