Qt关于输入法的备忘

1、Qt5自带的虚拟键盘

qtvirtualkeyboard源码在Qt源码根目录下,可以直接用QtCreator打开工程编译。

(1)界面上的‘地球’按钮可以切换中/英文,但是默认编译出的只有英文,如果要编译中文,需要在工程属性的Build Steps为qmake增加CONFIG+="lang-en_GB lang-zh_CN"(但是我加上了,虽然‘地球’按钮有‘简体中文’选项了,但点击字母还是不出现汉字)。

(2)解决编译时GLES2/gl2.h找不到的问题,在pro文件中增加
unix:{
#include
INCLUDEPATH+=/usr/local/src/Qt/qt-everywhere-opensource-src-5.9.6/qtbase/include/QtANGLE
}

2、QtSoftKeyboard

(1)输入法的原理

        它实际上是一个虚拟键盘。它是一个静态库,编译出来名字是libInputTool.a,这个静态库本身还引用了一个静态库libgooglepinyin.a。我们主要关心的是libInputTool.a本身。它实际上主要是编写了一个QWidget子类frmInput,然后通过单例模式(frmInput::Instance())构造一个frmInput对象,在对象中通过qApp->installEventFilter(this);,从而使得frmInput能够捕获到应用程序的所有事件,其中当捕获到focusChanged事件时,通过事件参数就可以得到焦点所在部件QWidget指针,比如QLineEdit,之后就是将输入的内容复制到该QWidget部件里。

(2)使用中遇到的问题

        输入法直接就不显示或者显示了但点击没反应,后一种情况里,虽然看似输入法在最顶层,但貌似由于Qt本身的问题它并不在最顶层,因为经调试发现点击事件被它后面的窗口直接拿到了,它拿不到。还有的时候,只在模态或非模态的一种情形下能显示(或能点击)。还有的时候,第一次打开窗口能显示(或能点击),再打开就不行了。还有的时候,在A对话框的部件里能用,但是A对话框上再建立一个B对话框,B对话框里就不能用了,或者B对话框构造函数里指定父窗口A可能就能用了,也可能不指定反而才能用了。总之,没什么规律可循。

(3)解决方法

主要尝试三种改动,看哪一种能生效。

a、对话框构造函数里指定或去掉父窗口。

b、加上或去掉setWindowModality(Qt::WindowModal);

c、这种方法目前看是最有效的,就是在新建对话框之前新建frmInput,不过这种方法需要delete旧的frmInput,可以通过修改frmInput::Instance函数实现:

    static frmInput *Instance() {
        if (_instance)
        {
            delete _instance;
            _instance = NULL;
        }

        _instance = new frmInput;

        return _instance;
    }

然后在新建对话框前调用frmInput::Instance()->Init();

你可能感兴趣的:(qt,开发语言)