项目介绍
环境介绍:x86+银河麒麟v10 arm+银河麒麟v10
需求分析:在arm平台上(一个平板)运行qt程序需要使用软键盘,不会配置键盘和鼠标,故需要使用软键盘。
方案总结:
- 使用自己开发或者从网上下载一个可用的软键盘及输入法包
- 使用qt原生的qvirtualkeyboard模块来实现软键盘的功能
- 平板本身安装了麒麟软键盘输入法,利用该输入法完成唤醒软键盘的功能
方案分析:
- 第一种方案自己研发耗时耗力,项目比较紧的情况下不推荐该种做法;从网上下载好用的软键盘及输入法,此种方案可行,但是美观及输入法的功能都有局限性,故用作备用方案。
- 若考虑采用麒麟软键盘输入法,但是在平板上运行程序后,qt程序有时无法环境该软键盘,需要通过键盘手动切换下输入法才可以,此种方法也不可行。
- 偶然看到qt本身有提供virtualkeyboard模块,经过了解后,软件的外观和输入法的功能都能满足项目需求,故采用qt提供的virtualkeyboard模块进行实现。
效果预览:
使用方法
很多朋友可能会又有这样的疑问,如果要使用qt提供的virtualKeyboard模块,应该要怎么做呢?其实很简单,有两个步骤:
- 首先确认的自己使用的qt是否编译或者安装了virtualkeyboard动态库,以我的库为例QTDIR/5.15.2/gcc_64/lib下存在libQt5VirtualKeyboard.so libQt5VirtualKeyboard.so.5 libQt5VirtualKeyboard.so.5.15 libQt5VirtualKeyboard.so.5.15.2
- 在main函数中最开始加入这样一句就可以了,然后编译运行,试试把。
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
可能会遇到的问题
- 很多时候我们会遇到一个模态弹窗(qdialog)弹出时,qvirtualkeyboard无法弹出或者弹出后点击软键盘没有任何反应,这是因为模态窗口的机制导致的,解决的思路是模态窗口默认情况下阻塞的范围是应用程序级别(Qt::ApplicationModal)的,即模态窗口弹出后,该窗口所属的应用程序其它部分都会被阻塞,无法操作。那除此之外还有一个级别即窗口级别(Qt::WindowModal),它的含义是该模态窗口仅会阻塞其祖先窗口对象,但是不会影响非其祖先窗口对象。解决方法就是在执行exec之前执行如下语句
dialog.setWindowModality(Qt::WindowModal);
- 我的应用场景是利用qtwebengineView与qvirtualkeyboard一起使用,在qwebengineview下的控件获取焦点后弹出软键盘。这种情况下发生了一种现象:当我们在简体中文输入法下输入一个字符,正常情况下会在软键盘的上部出现一个汉字的候选项,然后用户需要通过鼠标或者触摸选择汉字并输入到对应的编辑框中,但是在qwebengineview下输入字符后却无法看到汉字候选项,而且文字会不经过选择自动输入到qwebengineview中的编辑框中,造成的后果是用户无法选择汉字了,这是一个很严重的问题。解决方法找了好久,终于找一个可用的,如下所示:
可以在qvirtualkeyboardinputcontext_p.cpp中的void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)函数中,注释掉
// update input engine
if ((newSurroundingText || newCursorPosition) &&
!testState(State::InputMethodEvent)) {
commit();
}
中的commit();语句即可,然后重新编译即可。qtwebengine运行时多次调用了update函数,而正常情况下没有调用,亲测有效!
- 由于我是在linux下发开发,自己编译的qtcreator直接qvirtualkeyboard目录会导致崩溃,后来经过实验,可以直接打开virtualkeyboard目录即可。方法如下:(1)到qt官网下载单独的qtvirtualkeyboard模块,网址如下:Index of /archive/qt/5.15/5.15.2/submodules,下载qtvirtualkeyboard-everywhere-src-5.15.2.tar.xz包并解压,不知道为啥使用qt源码大包里面的qtvirtualkeyboard编译出来的会崩溃。(2)通过qtcreator进入目录qtvirtualkeyboard-everywhere-src-5.15.2/src/virtualkeyboard选择virtualkeyboard.pro打开即可,然后编译即可,编译输出的动态库在qtvirtualkeyboard-everywhere-src-5.15.2/lib路径下,然后生成的动态库拷贝到qt安装目录下即可,脚本如下所示:
cp -f libQt5VirtualKeyboard.so /opt/Qt/5.15.2/gcc_64/lib
cp -f libQt5VirtualKeyboard.so.5 /opt/Qt/5.15.2/gcc_64/lib
cp -f libQt5VirtualKeyboard.so.5.15 /opt/Qt/5.15.2/gcc_64/lib
cp -f libQt5VirtualKeyboard.so.5.15.2 /opt/Qt/5.15.2/gcc_64/lib
cp -f libQt5VirtualKeyboard.so.5.15.2.debug /opt/Qt/5.15.2/gcc_64/lib
- 调整软件盘可拖动,默认情况下qvirtualkeyboard生成的软键盘是不能拖动的,如果有拖动的需求可以按照如下方式进行修改:(1)进入到qvirtualkeyboard的源码目录qtvirtualkeyboard-everywhere-src-5.15.2/src/virtualkeyboard/content,打开InputPanel.qml文件,改成如下方式
SelectionControl {
objectName: "selectionControl"
x: -parent.x
y: -parent.y
enabled: active && !keyboard.fullScreenMode && !desktopPanel
}
property real mouseXTMP: 0
property real mouseYTMP: 0
MouseArea {
anchors.fill: parent
onPressed: {
mouseXTMP = mouseX
mouseYTMP = mouseY
}
onPositionChanged: {
inputPanel.x = mouseX + inputPanel.x - mouseXTMP
inputPanel.y = mouseY + inputPanel.y - mouseYTMP
}
enabled: active
}....
上面红色部分添加后即可支持拖动,然后重新编译拷贝到qt安装目录即可。
未解决的问题
- 通过研究官方提供的用例basic,,发现在pro文件中添加“CONFIG += disable-desktop”后,软键盘弹出方式及软键盘的大小发生了变化,而且当界面变大时,软键盘遮挡输入框时,会自动在前面生成了一个大的输入区域,可以让用户看到输入的值是什么,这个功能我还没有添加到我的项目中。
- 修改输入法的种类,默认的qvirtualkeyboard输入法种类特别,需要进行定制,不能要那么的种类
- 探索是否有其他的方法可以修改软键盘的大小和拖动