Qt在应用程序窗口之外获取鼠标事件

时间:2014-08-22 09:00:47

标签: c++ qt mouseevent x11

首先,我不确定如果没有某种X.11输入的黑客攻击,这是可能的,但discussions我看到online让我认为这是可能的。

请允许我解释一下我希望做的事情。我想要一个Qt应用程序,它很可能只是一个小窗口,在屏幕上有点像小部件。在用户将另一个应用程序窗口拖到其顶部之前,应用程序不执行任何操作。我希望检测到这一点的方法是跟踪鼠标,看看左键是否向下,鼠标是否在Qt窗口上,而Qt不是活动窗口,然后执行一些操作。但是,当我的Qt应用程序不是活动窗口时,我当前无法获得鼠标事件。我认为我链接的一些帖子在QApp中将'window'称为QWindow。

我的意思是窗口然而是X.11窗口,任何在X中打开的应用程序。我的截图我希望突出我当前的困境。我也附上了我的代码,很乐意接受任何建议。任何其他可以帮助我实现这一目标的黑客我也很感激被告知。

State1

红色显示我的光标所在的位置,鼠标事件记录在Qt窗口之外。然而,这是由'FocusOut'事件触发的,也是我设法检测到的最后一个事件。

State 2

正如我们在控制台中看到的那样,鼠标已移动但未捕获任何事件。我真的想要检测鼠标何时越过Qt App Window所处的位置,无论它是否在另一个窗口的顶部。

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()));
    qDebug() << QString::number(mouseEvent->pos().x());
    qDebug() << QString::number(mouseEvent->pos().y());
  }
  if (event->type() == QEvent::FocusOut)
 {
     QFocusEvent *focusEvent = static_cast<QFocusEvent*>(event);
     focusEvent->accept();
     qDebug()<<"event Filter Mouse Move111"<<QCursor::pos();
 }
  return false;
}


void MainWindow::initWindow()
{
    //Makes the window frameless and always on top
    //setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
    //Makes the window transparent
    //setAttribute(Qt::WA_TranslucentBackground);


    //Allows 'mouseMoved' events to be sent, not sure yet if this will be useful, I think we want mouseDragged
    setMouseTracking(true);
    grabMouse();

    //setup this as an event filter for mouse events
    qApp->installEventFilter(this);
}

1 个答案:

答案 0 :(得分:3)

好的,我是怎么解决这个问题的。 Qt中的事件系统,我假设的任何应用程序,在窗口未激活时都不会注册事件。但是,该过程显然仍在运行,因此您可以在窗口处于活动状态时访问的数据可以在窗口不再处于活动状态时访问。

使用定时轮询方法每n秒获取一次鼠标位置

//Method used to hopefully track the mouse regardless of whether or not it is inside the active window
void MainWindow::pollMouse(unsigned long sec)
{
    //Loop forever
    while ( true )
    {
        QPoint mouseLoc = QCursor::pos();
        qDebug() << "Mouse position global: x,y"  << mouseLoc.x() << mouseLoc.y();

        QThread::sleep(sec);
    }
}