Qvirtualkeyboard使用及相关知识点

项目介绍

环境介绍:x86+银河麒麟v10 arm+银河麒麟v10

需求分析:在arm平台上(一个平板)运行qt程序需要使用软键盘,不会配置键盘和鼠标,故需要使用软键盘。

方案总结:

  • 使用自己开发或者从网上下载一个可用的软键盘及输入法包
  • 使用qt原生的qvirtualkeyboard模块来实现软键盘的功能
  • 平板本身安装了麒麟软键盘输入法,利用该输入法完成唤醒软键盘的功能

方案分析:

  1. 第一种方案自己研发耗时耗力,项目比较紧的情况下不推荐该种做法;从网上下载好用的软键盘及输入法,此种方案可行,但是美观及输入法的功能都有局限性,故用作备用方案。
  2. 若考虑采用麒麟软键盘输入法,但是在平板上运行程序后,qt程序有时无法环境该软键盘,需要通过键盘手动切换下输入法才可以,此种方法也不可行。
  3. 偶然看到qt本身有提供virtualkeyboard模块,经过了解后,软件的外观和输入法的功能都能满足项目需求,故采用qt提供的virtualkeyboard模块进行实现。

效果预览:

Qvirtualkeyboard使用及相关知识点_第1张图片

使用方法

很多朋友可能会又有这样的疑问,如果要使用qt提供的virtualKeyboard模块,应该要怎么做呢?其实很简单,有两个步骤:

  1. 首先确认的自己使用的qt是否编译或者安装了virtualkeyboard动态库,以我的库为例QTDIR/5.15.2/gcc_64/lib下存在libQt5VirtualKeyboard.so libQt5VirtualKeyboard.so.5 libQt5VirtualKeyboard.so.5.15 libQt5VirtualKeyboard.so.5.15.2
  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输入法种类特别,需要进行定制,不能要那么的种类
  • 探索是否有其他的方法可以修改软键盘的大小和拖动

你可能感兴趣的:(Qt,qt)