Russian Qt Forum
Апрель 19, 2024, 10:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Отправка событий мыши в QQuickWindow (залипание)  (Прочитано 2705 раз)
NoIdea
Новичок

Offline Offline

Сообщений: 12


Просмотр профиля
« : Октябрь 09, 2018, 22:56 »

Здравствуйте, есть задача, надо отправить сообщения мыши в 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

К сожалению вызывать его постоянно не получится, внутри есть проверка на текущую активность окна, а постоянно деактивировать текущее окно - это уже не костыль, а костылище :)
« Последнее редактирование: Октябрь 10, 2018, 19:24 от NoIdea » Записан
NoIdea
Новичок

Offline Offline

Сообщений: 12


Просмотр профиля
« Ответ #1 : Октябрь 10, 2018, 19:35 »


ВЕРНОЕ РЕШЕНИЕ:
QMouseEvent mouseEvent(type, pos, pos, button, Qt::NoButton, Qt::NoModifier);


Ранее...

Кто бы мог подумать, но решением оказался такой вот костыль:

Код
C++ (Qt)
QCoreApplication::sendEvent(window_, event);
 
if (event->type() == QEvent::MouseButtonRelease)
{
 auto item = window_->mouseGrabberItem();
 if (item)
   item->ungrabMouse();
}

Синтезированные события были идентичны с реальной мышью, но на перетаскиваемом элементе после синтезированного события MouseButtonRelease, заметил, что если пошевелить мышью, то элемент продолжал перетаскиватся (не отпускался) т.е. получается, что не каждое событие MouseButtonRelease одинаково полезно ;)
Остальные элементы, похоже, тоже захватывают мышь и не отпускают по синтезированным сообщениям.

Пути QtQuick неисповедимы... Вероятно, что-то делаю не так?...
« Последнее редактирование: Июнь 07, 2019, 23:06 от NoIdea » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.09 секунд. Запросов: 22.