0

我正在尝试为我的 Qt 应用程序创建一个测试。目的是通过移动鼠标并使用 X11 库单击 QGraphicsItems 或 QWidgets 来测试应用程序的 GUI。

该测试是作为我的 Qt 应用程序的插件编写的。它启动一个单独的 QThread 并在 run() 函数中移动鼠标。让我们称之为“测试运行线程”

但是我还需要获取 GUI 的结构,即各种小部件的位置,因此在“测试运行线程”中,我通过 QApplication::topLevelWidgets() 并找到我感兴趣的那个。然后我调用 mapToGlobal( ) 在此小部件上获取其全局位置。然后可以将此位置提供给 X11 鼠标功能以将鼠标移动到小部件上。

这通常有效,但偶尔我会收到此错误“Xlib:意外异步回复”一些谷歌搜索显示这可能是由于设置 QWidget 位置或尝试从另一个线程更新它们。

但我只是在另一个线程中获取有关小部件的信息。为什么会导致问题?:(

如果一切都失败了,我准备将某种通信队列设置回主(GUI)线程。“测试运行线程”将在队列中请求有关小部件的信息,并且 GUI 线程可以响应它们。

插件启动一个单独的线程来移动鼠标的原因是因为 GUI 必须继续响应事件,否则整个练习点都会丢失。我知道我也不能使用线程,只需在主线程中移动鼠标,定期调用 processEvents()。那是我猜的另一个选择。

以前走这条路的人的任何想法都会非常有帮助。谢谢 !

4

1 回答 1

0

但我只是在另一个线程中获取有关小部件的信息。为什么会导致问题?:(

因为您仍在来回发送 X 协议消息。toGlobal() 肯定会向 X 服务器查询小部件的实际位置(因为它可能已被其他方式移动)。所以不幸的是,就 X 而言,“只是获取一些信息”并不是一个 const 操作。实际上,出于同样的原因,将鼠标从测试线程中移出也是一个很大的禁忌。

在您的情况下,我会简单地使用零超时 QTimer/processEvents 并忘记线程;设置队列来来回移动事件是不值得的,更不用说您需要在代码中添加互斥锁(!)。

于 2013-04-04T02:11:48.533 回答