QML WebEngineView Flick Content

Я пытаюсь сделать простой веб-браузер для рабочего стола с Ubuntu 14.04, используя компоненты QML и WebEngineView. Приложение будет работать на устройствах с сенсорной панелью, поэтому было бы неплохо, чтобы содержимое, отображаемое внутри WebEngineView, отображалось на экране.

Я пытался сделать это таким образом, но это не работает:

...    
        WebEngineView {
            id: webView
            url: "http://google.com"
            width: parent.width
            height: winternet.height-navigationBar.height-iStatusBar.height-iBackButton.height
            anchors.top: navigationBar.bottom

            MouseArea {
                anchors.fill: parent
                drag.target: parent.data
            }

            onLinkHovered: {
                webView.url = hoveredUrl
            }
       }
...

Если у вас есть идеи или опыт с этим, пожалуйста, помогите!

1 ответ

Я тоже хотел сделать WebEngineView привлекательным. Я решил, что лучше делать это с помощью Flickable. Но наивный подход сделать что-то вроде:

...
Flickable {
    WebEngineView {...}
}
...

не будет работать.

Дальнейшие исследования привели меня к основанному на Qt веб-браузеру для встроенных сенсорных устройств. Я попробовал это на своем ПК. Кажется, что он делает именно то, что я хочу, но это слишком сложно, и лицензия GPL делает его бесполезным для любого использования.

После некоторых экспериментов я обнаружил, что щелчок будет работать, если Flickable.contentHeight и Flickable.contentWidth хотя бы соответствуют фактическому размеру веб-страницы, отображаемой WebEngineView. Эти свойства Flickable могут иметь большие значения, чем фактический размер страницы. В этом случае вы сможете выйти за пределы содержимого страницы. Если Flickable.contentHeight и / или Flickable.contentWidth меньше размера страницы, вы все равно сможете пролистывать. Вам решать, хотите вы этого или нет)

Таким образом, в итоге получился фактический отображаемый размер страницы и были установлены значения Flickable.contentHeight и Flickable.contentWidth. Я расскажу вам короткую историю: нет способа получить нужные значения с помощью API WebEngineView (или, по крайней мере, я ничего не нашел в документации Qt 5.7/5.8). Но я случайно нашел этот ответ на SO. Используя этот ответ, мне удалось заставить все работать:

...
Item {
    Layout.fillHeight: true
    Layout.fillWidth: true

    Flickable {
        id: flick
        anchors.fill: parent

        WebEngineView {
            anchors.fill: parent
            id: webView
        }
    }

    webView.onLoadingChanged: {
        if (webView.loadProgress == 100) {
            webView.runJavaScript(
                "document.documentElement.scrollHeight;",
                function (i_actualPageHeight) {
                    flick.contentHeight = Math.max (
                        i_actualPageHeight, flick.height);
                })
            webView.runJavaScript(
                "document.documentElement.scrollWidth;",
                function (i_actualPageWidth) {
                    flick.contentWidth = Math.max (
                        i_actualPageWidth, flick.width);
                })
        }
    }
}
...

Код, приведенный выше, может потребовать некоторых корректировок, но это почти копия кода, который у меня работает.

UPD 1: я обнаружил, что это не окончательное решение, потому что по какой-то причине после загрузки новой страницы document.documentElement.scrollWidth не может быть сброшен и останется таким же, как и для предыдущей страницы.

UPD 2: я решил вышеупомянутую проблему, но решение немного уродливо: сброс Flickable.contentWidth в WebEngineView.onLoadingChanged на Flickable.width. Установка 0 для Flickable.contentWidth приведет к неоправданно большой высоте содержимого после загрузки.

Еще одно изменение, которое я сделал, было снятие требования для 100% состояния загрузки.

Другие вопросы по тегам