我正在尝试为我的 Qt 应用程序创建一个测试。目的是通过移动鼠标并使用 X11 库单击 QGraphicsItems 或 QWidgets 来测试应用程序的 GUI。
该测试是作为我的 Qt 应用程序的插件编写的。它启动一个单独的 QThread 并在 run() 函数中移动鼠标。让我们称之为“测试运行线程”
但是我还需要获取 GUI 的结构,即各种小部件的位置,因此在“测试运行线程”中,我通过 QApplication::topLevelWidgets() 并找到我感兴趣的那个。然后我调用 mapToGlobal( ) 在此小部件上获取其全局位置。然后可以将此位置提供给 X11 鼠标功能以将鼠标移动到小部件上。
这通常有效,但偶尔我会收到此错误“Xlib:意外异步回复”一些谷歌搜索显示这可能是由于设置 QWidget 位置或尝试从另一个线程更新它们。
但我只是在另一个线程中获取有关小部件的信息。为什么会导致问题?:(
如果一切都失败了,我准备将某种通信队列设置回主(GUI)线程。“测试运行线程”将在队列中请求有关小部件的信息,并且 GUI 线程可以响应它们。
插件启动一个单独的线程来移动鼠标的原因是因为 GUI 必须继续响应事件,否则整个练习点都会丢失。我知道我也不能使用线程,只需在主线程中移动鼠标,定期调用 processEvents()。那是我猜的另一个选择。
以前走这条路的人的任何想法都会非常有帮助。谢谢 !