qt提供了 virtualKeyboard 虚拟键盘模块,只需要在在main函数中最开始加入这样一句就可以了
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
但是在使用的时候遇到了一些问题:
1、中文输入的时候没有输入提示
Qvirtualkeyboard使用及相关知识点_qtvirtualkeyboard-CSDN博客
在简体中文输入法下输入一个字符,正常情况下会在软键盘的上部出现一个汉字的候选项,然后用户需要通过鼠标或者触摸选择汉字并输入到对应的编辑框中,但是在qwebengineview下输入字符后却无法看到汉字候选项,而且文字会不经过选择自动输入到qwebengineview中的编辑框中,造成的后果是用户无法选择汉字了
解决方法:参考上面链接,修改 qtvirtualkeyboard-everywhere-src-5.15.2 的源码,然后重新编译
可以在qvirtualkeyboardinputcontext_p.cpp中的
void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)函数中,
注释掉
// update input engine
if ((newSurroundingText || newCursorPosition) &&
!testState(State::InputMethodEvent)) {
commit();
}
中的commit();语句即可,然后重新编译即可
2、键盘退出的时候发生段错误
问题排查:开始qtWeb浏览器程序是通过qtWidget调用 QWebEngine 控件来实现的,只是在main中加了 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 后面经排查发现只在 QWebEngine 中使用Qvirtualkeyboard 会有问题,在其他的比如 QMainWindow、QWidget中使用 Qvirtualkeyboard 都没问题。只能在QtQuick中使用WebEngineView控件来开启浏览器,而且要定义InputPanel才可以!!猜测可能是QTWidget的QWebEngine控件对QMl的Qvirtualkeyboard控件支持不好的原因吧!
下面是在QtQuick中使用WebEngineView控件来启动浏览器,使用InputPanel虚拟键盘
ApplicationWindow {
width: 1280
height: 800
visible: true
WebEngineView {
id: webEngineView
anchors.fill: parent
url: "https://www.baidu.com"
onNewViewRequested: {
console.log(request.requestedUrl)
url = request.requestedUrl
}
// // 加载完成后触发打印为 PDF
// onLoadingChanged: {
// if (loadRequest.status === WebEngineView.LoadSucceededStatus) {
// webEngineView.printToPdf("output.pdf")
// }
// }
onLinkHovered: {
}
}
InputPanel {
id: inputPanel
z: 99
x: 0
y: parent.height
width: parent.width
// externalLanguageSwitchEnabled:true
states: State {
name: "visible"
when: inputPanel.active
PropertyChanges {
target: inputPanel
y: parent.height - inputPanel.height
}
}
transitions: Transition {
from: ""
to: "visible"
reversible: true
ParallelAnimation {
NumberAnimation {
properties: "y"
duration: 250
easing.type: Easing.InOutQuad
}
}
}
onActiveChanged: {//当输入框活跃状态改变的时候
}
Component.onCompleted: {
// VirtualKeyboardSettings.styleName = "retro"
VirtualKeyboardSettings.activeLocales = ["en_US", "zh_CN"]
}
}
}