Илья
5 мая 2019 г. 6:28

Как поймать событие нажатия мыши в WebEngineView в QML

#QML, #Qt, #WebEngine, #WebEngineView

Имеется следующего вида код в QML

  1. import QtQuick 2.12
  2. import QtWebEngine 1.8
  3. import QtQuick.Controls 1.4
  4. import QtQuick.Controls.Styles 1.4
  5.  
  6. Item {
  7. ....
  8. WebEngineView {
  9. id: infoLayout
  10. anchors.fill: parent
  11. }
  12. }

В WebEngineView идет просмотр HTML контента. В программе работает таймер, который отвечает за запуск скринсейвера, если в окне ничего не происходит. По задумке таймер должен сбрасываться по касанию экрана пользователем.
Стандартная вставка кода (вне блока WebEngineView), типа:

  1. MouseArea {
  2. anchors.fill: parent
  3.  
  4. onPressed: {
  5. saverVisable.restart()
  6. console.log("CLICK!!!")
  7. }

приводит к тому, что перекрывает весь экран WebEngineView и нельзя работать с HTML конентом. Если MouseArea вставить внутри блока WebEngineView, то вовсе ничего не происходит. Пробовал вариант через Action, типа

  1. Action {
  2. shortcut: "Escape"
  3. onTriggered: {
  4. console.log("Escape pressed.");
  5. saverVisable.restart()
  6. }
  7. }

Работает, однако, я как понял из доков, в shortcut нельзя задавать события нажатия клавиш мыши (или можно?? поправьте меня пожалуйста, если это не так).
Пробовал через onActiveFocusOnPressChanged, он почему-то тоже никак не реагирует, подозреваю что неправильно инициализирую...
И еще осталась надежда на runJavaScript, однако его тоже нужно вызывать по наступлению какого либо события, поэтому кусок кода

  1. onActiveFocusOnPressChanged: {
  2.  
  3. runJavaScript ('onClick();', function(result) {
  4. res = result;
  5. });
  6.  
  7. if (res === "true") {
  8. saverVisable.restart()
  9. console.log(res)
  10. }
  11. }

тоже никакого результата не дал...
Прошу, помогите!

4

Вам это нравится? Поделитесь в социальных сетях!

3
Evgenii Legotckoi
  • 9 мая 2019 г. 13:27
  • Ответ был помечен как решение.

Добрый день!

Попробуйте модфицировать вариант с MouseArea таким образом

  1. MouseArea {
  2. anchors.fill: parent
  3. propagateComposedEvents: true
  4.  
  5. onPressed: {
  6. saverVisable.restart()
  7. console.log("CLICK!!!")
  8. mouse.accepted = false
  9. }
  10. }

Дело в том, что по умолчанию MouseArea забирает все действия и не передаёт на ниже лежащие объекты. А propagateComposedEvents как раз отвечает за включение передачи событий на вниз. Если установить true, то события должны будут передаваться ниже в WebEngineView

    Илья
    • 9 мая 2019 г. 15:06

    Евгений, огромное Вам спасибо! Уже три ночи бился с этой проблемой, пробовал и с С++ обвязать через сигналы, и через Java скрипты...в итоге "велосипед на велосипеде" с кривой работой. Забыл написать, что я как раз и начинал с параметра propagateComposedEvents в MouseArea, но он тоже не помогал. Однако вот это казалось бы простая, но важная строчка mouse.accepted = false, которая как светофор разрешает дальнейшую работу мыши на HTML странице! Именно она позволила решить задачу, которая нигде не описана (трехдневный поиск на всех возможных форумах).
    Спасибо Вам огромное!

      Evgenii Legotckoi
      • 9 мая 2019 г. 15:10

      Пожалуйста. К сожалению раньше ответить не мог, не было времени просмотреть вопросы на форуме. Будут ещё вопросы, не стесняйтесь задавать их здесь на форуме. Да и если сами кому поможете - тоже будет очень хорошо.

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь