Здравствуйте, есть задача, надо отправить сообщения мыши в QtQuick интерфейс - эмуляция мыши (нажатия, перемещения).
Но сообщения, почему-то приходят лишь в один (текущий) QML-элемент (
QQuickItem).
Казалось бы ничего сложного:
C++ (Qt)
QQmlApplicationEngine engine;
//...
auto type = QEvent::MouseButtonPress;
auto pos = QPoint(50, 50);
const auto button = (type == QEvent::MouseMove ? Qt::NoButton : Qt::LeftButton);
QMouseEvent mouseEvent(type, pos, pos, button, button, Qt::NoModifier);
QCoreApplication::sendEvent(engine.rootObjects().at(0), &mouseEvent);
engine.rootObjects().at(0) - это окно
QQuickWindow.
Всё это работает в простой реализации, НО не работает на сложных интерфейсах, где много элементов визуальных и не визуальных + 3D графика (Qt3D.Scene3D).
Точнее работает, но сообщения приходят лишь в один элемент. Если кликнуть мышью на другой элемент, то сообщения будут уже приходить только ему.
А ещё более странное, то что если перед отправкой сообщения сделать окно не активным, а прямо перед отправкой снова сделать активным, то сообщения мыши приходят как положено! Кто-нибудь с таким сталкивался?
Что делает чудотворное
requestActivate()?
https://code.woboq.org/qt5/qtbase/src/gui/kernel/qwindow.cpp.html#_ZN7QWindow15requestActivateEvК сожалению вызывать его постоянно не получится, внутри есть проверка на текущую активность окна, а постоянно деактивировать текущее окно - это уже не костыль, а костылище :)