Илья
31 марта 2020 г. 15:02

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

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

3
Evgenii Legotckoi
  • 31 марта 2020 г. 15:09
  • (ред.)
  • Ответ был помечен как решение.

Добрый день.

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

  1. WebEngineView {
  2. id: infoLayout
  3.  
  4. onUrlChanged: {
  5. console.log(url)
  6. }
  7. }
    Илья
    • 2 апреля 2020 г. 3:53

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

      Evgenii Legotckoi
      • 2 апреля 2020 г. 12:46

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

        Комментарии

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