c++ - Qt获取应用程序窗口外的鼠标事件

标签 c++ qt mouseevent x11

首先,我不确定如果不对 X.11 输入进行某种黑客攻击,这是否可行,但 discussions我见过online让我觉得这是可能的。

请允许我解释一下我希望做什么。我想要一个 Qt 应用程序,它很可能只是一个小窗口,位于屏幕的一侧,有点像一个小部件。在用户将另一个应用程序窗口拖到它上面之前,应用程序什么都不做。我希望检测到这一点的方法是跟踪鼠标并查看左键单击是否按下并且鼠标是否在 Qt 窗口上方并且 Qt 不是事件窗口然后执行一些操作。但是,当我的 Qt 应用程序不是事件窗口时,目前我无法获取鼠标事件。我认为我链接的其中一些帖子将“窗口”称为 QApp 内的 QWindow。

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

State1

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

State 2

正如我们在控制台中看到的,鼠标已经移动但没有捕获到任何事件。我真的很想检测鼠标何时越过 Qt 应用程序窗口所在的位置,无论它是否在另一个窗口的顶部。

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

最佳答案

好的,这是我解决这个问题的方法。 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);
    }
}

关于c++ - Qt获取应用程序窗口外的鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25443236/

相关文章:

c++ - 模板类外部长定义的替代方案

Qt Creator 帮助 : Font size is too small

c++ - 如何分配和更改 QString 的值?

qt - 如何将悬停或鼠标区域更新事件传播到 QML 中的较低元素?

c# - 在 wpf 中单击鼠标时如何控制较低的 zindex?

c++ - setData() 和 insert Rows() Qt 模型 View

c++ - if - else vs if and returns 重新访问(不询问是否可以多次返回)

c++ - Rcpp 可以替换 R 中的 unif 函数吗?

c++ - Qt 如何删除对象?存储 QObject 的最佳方式是什么?

angular - 我可以用其他鼠标事件运行@HoSTListner 吗?