首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Qt在应用程序窗口之外获取鼠标事件

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

Stack Overflow用户
提问于 2014-08-22 17:00:47
回答 1查看 4.6K关注 0票数 4

首先,如果不对X.11输入进行某种黑客攻击,我甚至不确定这是否可能,但我看到的onlinediscussions让我认为这是可能的。

请允许我解释一下我希望做什么。我想要一个Qt应用程序,这将最有可能只是一个小窗口,在屏幕上,有点像一个小工具。在用户将另一个应用程序窗口拖到应用程序窗口上方之前,应用程序不会执行任何操作。我希望检测到这一点的方法是跟踪鼠标,看看鼠标左键是否按下,鼠标是否在Qt窗口上,而Qt不是活动窗口,然后执行一些操作。然而,当我的Qt应用程序不是活动窗口时,我目前还不能获得鼠标事件。我认为我链接的一些帖子将“窗口”称为QApp中的QWindow。

然而,我所说的窗口是指X.11窗口,任何在X中打开的应用程序。我的屏幕截图希望能突出我目前的困境。我也附上了我的代码,并乐于接受任何建议。任何其他已知的帮助我实现这一点的黑客,我也将不胜感激。

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

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

代码语言:javascript
运行
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2014-08-23 13:55:29

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

使用计时轮询方法每隔n秒获取鼠标位置

代码语言:javascript
运行
复制
//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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25443236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档