Илья
March 31, 2020, 3:02 p.m.

WebEngineView : некорректно работает onLinkHovered при использовании на сенсорных устройствах

#QML, #Qt, #WebEngineView

Здравствуйте!
Задача стоит такая. В QML через объект WebEngineView происходит просмотр HTML страниц. Необходимо при переходе по ссылке записывать новый адрес в массив (ListModel). Проблема состоит в том, что чтение url после загрузки страницы, например в конструкции типа

  1. onLoadingChanged: {
  2. if (loadRequest.status === WebEngineLoadRequest.LoadSucceededStatus) {
  3. // здесь читаем url загруженной страницы...
  4. }
  5. }

не дает ожидаемого результата. Считывается старый url адрес, а не новый.
Однако есть замечательный сигнал onLinkHovered, где используя выше конструкцию можно добиться желаемого результата:

  1. onLinkHovered: {
  2. tmpUrl = hoveredUrl
  3. }
  4.  
  5. onLoadingChanged: {
  6. // LoadSucceededStatus пришлось поменять на LoadStartedStatus, иначе tmpUrl пусто
  7. if (loadRequest.status === WebEngineLoadRequest.LoadStartedStatus) {
  8. console.log("infoLayout: onLoadingChanged tmpUrl = "+tmpUrl)
  9. // в tmpUrl хранится как раз уже новый адрес страницы - ура, товарищи!
  10. }
  11. }

Казалось бы happyEnd...но на сенсорных устройствах с мультитачем tmpUrl в onLinkHovered всегда пуст как при переходе по ссылкам, так и при наведении на них...Для обработки событий мыши на странице использовал как MouseArea, так и MultiPointTouchArea, результат один - на сенсорных устройствах tmpUrl пустая, при работе на ноутбуке все как надо....

Есть у кого идеи в чем может быть дело? Прикладываю блок кода WebEngineView ниже:

  1. WebEngineView {
  2. id: infoLayout
  3.  
  4. anchors.fill: parent
  5. MultiPointTouchArea {
  6. anchors.fill: parent
  7. onReleased: {
  8. console.log("infoLayout: MultiPointTouchArea onReleased!!!")
  9. }
  10. }
  11. settings.pluginsEnabled: true
  12. settings.playbackRequiresUserGesture: false
  13. profile.httpCacheType: WebEngineProfile.NoCache
  14. focus: true
  15.  
  16. onLinkHovered: {
  17. tmpUrl = hoveredUrl
  18. }
  19.  
  20. onLoadingChanged: {
  21. if (loadRequest.status === WebEngineLoadRequest.LoadStartedStatus) {
  22. console.log("infoLayout: onLoadingChanged tmpUrl = "+tmpUrl)
  23. if (tmpUrl.length>0){
  24. listModelHistoryInfo.addPath(tmpUrl)
  25. }
  26. }
  27. }
  28. }
2

Do you like it? Share on social networks!

3
Evgenii Legotckoi
  • March 31, 2020, 3:09 p.m.
  • (edited)
  • The answer was marked as a solution.

Добрый день.

WebEngineView имеет свойство url , в документации на QML для свойств обычно не описывают отдельно сигналы, но как правило свойства имеют и сигналы. Думаю, что вам нужно попробовать навесить обработчик на сигнал изменения этого свойства.

  1. WebEngineView {
  2. id: infoLayout
  3.  
  4. onUrlChanged: {
  5. console.log(url)
  6. }
  7. }
    Илья
    • April 2, 2020, 3:53 a.m.

    Евгений, спасибо большое - то что нужно! Буду иметь ввиду...сколько всего перерыл - про это вообще ни слова...видимо разработчики Qt подумали, что и так должны быть все в теме)))

      Evgenii Legotckoi
      • April 2, 2020, 12:46 p.m.

      Я думаю, что это где-то описано, но в такой глубине документации и максимум в самых базовых вещах, то есть отдельно в классах этого не пишут, просто потому, что придётся писать для каждого класса половину базовой документации.
      Но обычно все, кто вдумчиво пользовался макросом Q_PROPERTY в C++ части, уже в курсе того, что из себя представляют свойства. Но согласен, вы не первый, кто мне говорит, что подобный момент не описан в документации.

        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