a
25 февраля 2020 г. 16:33

WebView

Задам, очень тупой вопрос, Как мне передать в url на webview, которая находится на другой странице, и затем я мог вернуться задать url, и подгрузить другую страницу. Условно говоря всего две qml - страница с webview, и первая с кнопкой и текстовым полем.

2

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

14
Evgenii Legotckoi
  • 25 февраля 2020 г. 16:52
  • (ред.)

Добрый день.

Самый простой однооконный вариант реализуется так

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. import QtWebView 1.13
  4. import QtQuick.Controls 2.13
  5.  
  6. Window {
  7. visible: true
  8. width: 640
  9. height: 480
  10. title: qsTr("Hello World")
  11.  
  12. TextField {
  13. id: textEdit
  14. anchors.left: parent.left
  15. anchors.top: parent.top
  16. anchors.right: button.left
  17. }
  18.  
  19. Button {
  20. id: button
  21. text: "Go"
  22. anchors.top: parent.top
  23. anchors.right: parent.right
  24.  
  25. onClicked: {
  26. webView.url = textEdit.text
  27. }
  28. }
  29.  
  30. WebView {
  31. id: webView
  32. anchors.left: parent.left
  33. anchors.top: textEdit.bottom
  34. anchors.right: parent.right
  35. anchors.bottom: parent.bottom
  36. }
  37. }
  38.  

Результат выглядит так

Конкретно в вашем случае, если у вас два qml файла, нужно смотреть код, возможно нужно будет прописать alias`ы на нужные объекты, чтобы всё увязать друг с другом.

    a
    • 25 февраля 2020 г. 17:06
    • (ред.)

    Спасибо, кажется понял, почему у меня не работало.

      a
      • 25 февраля 2020 г. 18:16

      Вообщем когда все было на одной странице все работало, На двух нет(

        Evgenii Legotckoi
        • 25 февраля 2020 г. 18:17

        я не экстрасенс. нужно смотреть ваш код

          a
          • 25 февраля 2020 г. 18:17
          • (ред.)
          1. id: expressPage
          2. allowedOrientations: Orientation.All
          3.  
          4. function setUrl(str) {
          5. webView.url = str
          6. }
          7.  
          8. SilicaWebView {
          9. id: webView
          10. // PullDownMenu and PushUpMenu must be declared in SilicaFlickable, SilicaListView or SilicaGridView
          11. PullDownMenu {
          12. MenuItem {
          13. text: qsTr("Вернуться на welcome")
          14. onClicked: {
          15. pageStack.clear()
          16. pageStack.push(Qt.resolvedUrl("Welcome.qml"))
          17. }
          18. }
          19. MenuItem {
          20. text: qsTr("Выход")
          21. onClicked: {
          22. Qt.quit()
          23. }
          24. }
          25. }
          26. anchors.fill: parent
          27.  
          28. onLoadingChanged: {
          29. console.log(webView.url)
          30. webView.update()
          31. }
          32.  
          33. quickScrollAnimating: true
          34.  
          35. experimental.preferences.webGLEnabled: true
          36. experimental.preferences.notificationsEnabled: true
          37. experimental.preferences.dnsPrefetchEnabled: true
          38. experimental.preferences.javascriptEnabled: true
          39. }

          Примерно как выглядит webview, может я что-то не дописал

            a
            • 25 февраля 2020 г. 18:23
            • (ред.)
            1. // To enable PullDownMenu, place our content in a SilicaFlickable
            2. SilicaListView {
            3. id: flickId
            4. anchors.fill: parent
            5.  
            6. // PullDownMenu and PushUpMenu must be declared in SilicaFlickable, SilicaListView or SilicaGridView
            7. PullDownMenu {
            8. MenuItem {
            9. text: qsTr("Выход")
            10. onClicked: {
            11. webApp.setAddress("")
            12. Qt.quit()
            13. }
            14. }
            15. }
            16.  
            17. Column {
            18. width: parent.width
            19. spacing: Theme.paddingLarge
            20. Label {
            21. id: emptyLabel
            22. height: mainPage.height / 3
            23. width: parent.width
            24. }
            25.  
            26. TextField {
            27. id: textField
            28. width: parent.width
            29.  
            30. horizontalAlignment: Text.AlignHCenter
            31. anchors.horizontalCenter: parent.horizontalCenter
            32. anchors.horizontalCenterOffset: Theme.horizontalPageMargin
            33. placeholderText: qsTr("www.google.com")
            34. validator: RegExpValidator { regExp: /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ }
            35. onTextChanged: {
            36. console.log(textField.text)
            37. }
            38. }
            39. Button {
            40. id: btnId
            41. anchors.horizontalCenter: parent.horizontalCenter
            42. text: "Send url"
            43. onClicked: {
            44. webApp.setUrl(textField.text)
            45. pageStack.push(Qt.resolvedUrl("WebView.qml"))
            46. }
            47. }
            48. Label {
            49. id: orId
            50. color: Theme.highlightBackgroundColor
            51. anchors.horizontalCenter: parent.horizontalCenter
            52. text: "or"
            53. }
            54. Button {
            55. id: btnSettings
            56. text: "Settings"
            57. anchors.horizontalCenter: parent.horizontalCenter
            58. onClicked: {
            59. var urlPath = "http://" + initWeb.getAddress()
            60. webApp.setUrl(urlPath)
            61. pageStack.push(Qt.resolvedUrl("WebView.qml"))
            62. }
            63. }

            Это первая страница

              a
              • 25 февраля 2020 г. 18:24

              Функция getAddress, возвращает строку из qsettings, из плюсовой части.

                Evgenii Legotckoi
                • 25 февраля 2020 г. 18:41
                • (ред.)

                так у вас ещё не чистый QML а Sailfish framework... Но тут очевидно ошибки логические и отсутствие правильного доступа к id. Дело не в самом фреймворке.

                Как называются эти две страницы и как они соотносятся друг с другом. Вторая страница вложена в первую? Первая называется WebView.qml? Что такое pageStack и откуда вы его взяли? Я не вижу в коде id: pageStack, да и обращение к id webApp во второй странице в этом коде является некорректным, поскольку доступа к нему нет.

                P/S/ в дальнейшем используйте специальный диалог для вставки программного кода на сайте. В toolbar редактора находится. Иначе некорректно делается форматирование.

                  a
                  • 25 февраля 2020 г. 18:44

                  Извините описался, уже поправил, страницы Welcome и WebApp.

                    Evgenii Legotckoi
                    • 25 февраля 2020 г. 18:46

                    тем не менее я не вижу pageStack, если это классический StackView, то сначала нужно загрузить в него WebView.qml, а потом пытаться загружать url

                    Как-то так

                    1. pageStack.push(Qt.resolvedUrl("WebView.qml"))
                    2. var urlPath = "http://" + initWeb.getAddress()
                    3. pageStack.currentItem.setUrl(urlPath)
                    4.  
                      a
                      • 25 февраля 2020 г. 18:59

                      Спасибо, исправил. Буду разбираться дальше, он что и сам обновляться не хочет

                        a
                        • 25 февраля 2020 г. 19:00

                          Evgenii Legotckoi
                          • 25 февраля 2020 г. 19:04
                          • (ред.)

                          Вот знаете, это вот треш

                          1. onUrlChanged: {
                          2. console.log(webView.url)
                          3. webView.url = "http://www.google.com/"
                          4. }

                          Представляете, как это работает?

                          Вы устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url, срабатывает onUrlChanged, выводит в консоль, вы снова устанавливаете url

                          Понятно?

                            a
                            • 25 февраля 2020 г. 19:06

                            Да

                              Комментарии

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