【发布时间】:2021-03-05 08:56:44
【问题描述】:
我有一个基于 WebEngineView 和 Qt Quick 虚拟键盘的非常简单的浏览器应用程序。
一切正常 - 每次单击 web 视图中的输入时,键盘都会完美显示,但令我困扰的是,如果我单击底部的输入,键盘会在打开后覆盖它,我不能看看我在输入什么。
我尝试通过调整 WebEngineView 元素的大小以适应键盘高度来解决这个问题,就像大多数移动应用程序一样。有效,我可以在键盘下滚动页面,但键盘仍然覆盖输入,我需要手动滚动。
有什么方法可以调整网页视图的滚动位置,使键盘不会覆盖来自 QML 的焦点输入? 我不能在单个网站上这样做,因为我允许导航到用户想要的任何网站,所以我需要一些通用方法。
这是我的 qml 代码:
import QtQuick 2.12
import QtQuick.Window 2.12
import FreeVirtualKeyboard 1.0
import QtWebEngine 1.8
Window {
id: appContainer;
visible: true
width: 1280
height: 600
title: qsTr("WebEngineView")
property string pathUrl: "https://www.w3schools.com/html/html_forms.asp"
WebEngineView {
id: webview
width: appContainer.width
url: appContainer.pathUrl
height: appContainer.height
}
/*
Virtual keyboard
*/
InputPanel {
id: inputPanel
z: 99
y: appContainer.height
anchors.left: parent.left
anchors.right: parent.right
states: State {
name: "visible"
when: Qt.inputMethod.visible
PropertyChanges {
target: inputPanel
y: appContainer.height - inputPanel.height
}
}
transitions: Transition {
from: ""
to: "visible"
reversible: true
ParallelAnimation {
NumberAnimation {
properties: "y"
duration: 150
easing.type: Easing.InOutQuad
}
}
onRunningChanged: {
if(!running && inputPanel.state == "visible") {
// finished showing keyboard
webview.height = appContainer.height - inputPanel.height
console.log('Keyboard shown')
} else if(running && inputPanel.state != "visible") {
// begins to hide keyboard
webview.height = appContainer.height
console.log('Keyboard starts to hide');
}
}
}
}
}
到目前为止,调整大小部分工作正常 - 我在 onRunningChanged 中执行此操作,因此 webview 在转换开始之前和结束之后调整大小 - 这可以防止在转换期间显示丑陋的空白空间。
更新
用webview.runJavaScript和scrollIntoView在显示键盘后达到了我想要的效果:
webview.runJavaScript("document.activeElement.scrollIntoView({block: 'nearest', inline: 'nearest', behavior: 'smooth'})");
但是我不确定这是否是最好的解决方案,因为我不喜欢将 javascript 评估纳入流程的事实。我想知道是否还有其他“本地”方式可以做到这一点。
【问题讨论】:
标签: qt qml qtquick2 qtwebengine