Я пытаюсь создать тест для своего приложения Qt. Цель состоит в том, чтобы протестировать графический интерфейс приложения, перемещая указатель мыши и щелкая QGraphicsItems или QWidgets с помощью библиотеки X11.
Тест написан как плагин для моего приложения Qt. Он запускает отдельный QThread, а в функции run () я перемещаю мышь. Назовем это «тестовым запущенным потоком».
Однако мне также нужно получить структуру графического интерфейса, т.е. расположение различных виджетов, поэтому в «потоке выполнения теста» я просматриваю QApplication :: topLevelWidgets () и нахожу тот, который мне интересен. Затем я вызываю mapToGlobal ( ) на этом виджете, чтобы получить свою глобальную позицию. Эта позиция затем может быть передана функциям мыши X11, чтобы навести указатель мыши на виджет.
Обычно это работает, но время от времени я получаю эту ошибку «Xlib: неожиданный асинхронный ответ». Некоторые поисковые запросы показали, что это может быть связано с настройкой позиций QWidget или попыткой обновить их из другого потока.
Но я просто получаю информацию о виджетах в другом потоке. Почему это может вызвать проблемы? :(
Если ничего не помогает, я готов настроить какую-то очередь связи обратно в основной (GUI) поток. «Тестовый запущенный поток» будет размещать запросы информации о виджетах в очереди, и поток графического интерфейса пользователя может на них отвечать.
Причина, по которой плагин запускает отдельный поток для перемещения мыши, заключается в том, что графический интерфейс должен продолжать реагировать на события, иначе вся суть упражнения будет потеряна. Я знаю, что могу также не использовать поток, а просто перемещать указатель мыши в основном потоке , регулярно вызывая processEvents (). Думаю, это другой вариант.
Любые идеи от кого-то, кто уже проходил этот путь раньше, были бы очень полезны. Спасибо !
1 ответ
Но я просто получаю информацию о виджетах в другом потоке. Почему это может вызвать проблемы? :(
Потому что вы все еще отправляете сообщения протокола X туда и обратно. toGlobal () обязательно запросит X-сервер о фактическом положении виджета (поскольку он мог быть перемещен каким-либо другим способом). Так что, к сожалению, «просто получить некоторую информацию» для X не является константной операцией. На самом деле, перемещение курсора мыши из тестового потока также является большим запретом по той же причине.
В вашем случае я бы просто использовал QTimer / processEvents с нулевым таймаутом и забыл о потоке; не стоит беспокоиться о настройке очередей для перемещения событий вперед и назад, не говоря уже о том, что вам нужно добавить мьютексы (!) в свой код.
Похожие вопросы
Новые вопросы
qt
Qt - это кроссплатформенная среда разработки приложений, широко используемая для разработки прикладного программного обеспечения, которая может работать на различных программных и аппаратных платформах с минимальными изменениями в базовом коде или без таковых, при этом обладая мощью и скоростью собственных приложений. Qt доступен как с коммерческими, так и с открытыми лицензиями.