Илья
May 5, 2019, 6:28 a.m.

Как поймать событие нажатия мыши в 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

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • May 9, 2019, 1:27 p.m.
  • The answer was marked as a solution.

Добрый день!

Попробуйте модфицировать вариант с 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

    Илья
    • May 9, 2019, 3:06 p.m.

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

      Evgenii Legotckoi
      • May 9, 2019, 3:10 p.m.

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

        Comments

        Only authorized users can post comments.
        Please, Log in or Sign up
        • Last comments
        • AK
          April 1, 2025, 11:41 a.m.
          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
        • Evgenii Legotckoi
          March 9, 2025, 9:02 p.m.
          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
        • VP
          March 9, 2025, 4:14 p.m.
          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
        • ИМ
          Nov. 22, 2024, 9:51 p.m.
          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        • Evgenii Legotckoi
          Oct. 31, 2024, 11:37 p.m.
          Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup