Qt5输入法实现

Qt开发过程中经常用到软键盘,自己做了个软键盘,记录笔记,方便自己以后查看,有需要的可以参考

Qt输入法实现方式有很多种,这里只介绍输入法插件方式的实现

话不多说,进入正题

输入法插件的创建

  • 工程文件
    新建工程,模板选择lib,QT模块需要添加gui-private

    QT += gui-private
    TEMPLATE = lib

  • 插件接口类
    继承QPlatformInputContextPlugin类,该类在qplatforminputcontextplugin_p.h中声明(gui-private)
    该类中需要实现create()函数,另外还需要调用Q_PLUGIN_METADATA进行声明,代码如下:

    class TestPlugin : public QPlatformInputContextPlugin
    {
        Q_OBJECT
        Q_PLUGIN_METADATA(IID QPlatformInputContextFactoryInterface_iid FILE "./res/test.json")
    
    public:
        TestContext *create(const QString &key, const QStringList &paramlist);
    };
    

    其中QPlatformInputContextFactoryInterface_iid 在qplatforminputcontextplugin_p.h中声明,test.json是保存插件名字的json文件,其内容如下:

    {
    “Keys”: [ “testPlugin” ]
    }

    关于宏Q_PLUGIN_METADATA的解释请移步Qt帮助文档:How to Create Qt Plugins
    Qt5输入法实现_第1张图片
    函数create()的实现:

    TestContext * TestPlugin ::create(const QString &key, const QStringList &paramlist)
    {
        Q_UNUSED(paramlist)
    
        if(key.compare("testPlugin",Qt::CaseInsensitive) == 0)
        {
            return new TestContext;
        }
        return nullptr;
    }
    
  • Context类的实现:
    TestContext 继承QPlatformInputContext类,该类在qplatforminputcontext.h中声明,主要实现如下几个函数:

    bool isValid();
    void setFocusObject(QObject *object);
    void showInputPanel();
    void hideInputPanel();
    bool isInputPanelVisible();

    其中setFocusObject()设置当前目标控件,showInputPanel()弹出软键盘,hideInputPanel()隐藏软键盘,isInputPanelVisible()返回当前键盘可见状态
    最后通过QCoreApplication::sendEvent()把字符串发送到目标控件
    具体实现代码如下:

    TestContext::TestContext()
    {
        m_keyboard = new Keyboard;
        connect(m_keyboard, &Keyboard::sendKey, this, &TestContext::sendKey);
    }
    void TestContext::sendKeyToFocusItem(const QString &keytext)
    {
        if(!m_focusitem)return;
        QCoreApplication::sendEvent(m_focusitem, new QKeyEvent(QEvent::KeyPress, 0, Qt::NoModifier, keytext));
        QCoreApplication::sendEvent(m_focusitem, new QKeyEvent(QEvent::KeyRelease, 0, Qt::NoModifier, keytext));
    }
    
    bool TestContext::isValid() const
    {
        return true;
    }
    
    void TestContext::setFocusObject(QObject *object)
    {
        m_focusitem = object;
    }
    
    void TestContext::showInputPanel()
    {
        if(m_keyboard->isHidden())m_keyboard->show();
    }
    
    void TestContext::hideInputPanel()
    {
        if(!m_keyboard->isHidden()){
            m_keyboard->hide();
        }
    }
    
    bool TestContext::isInputPanelVisible() const
    {
        return m_keyboard->isVisible();
    }
    
  • 软键盘类的实现
    实现一个输入键盘,设置自己喜欢的样式,自己想要的键值,自由发挥
    软键盘字符或字符串可以通过信号发送,如上文中与TestContext的连接信号sendKey():

    connect(m_keyboard, &Keyboard::sendKey, this, &TestContext::sendKey);

    示例:
    Qt5输入法实现_第2张图片

  • 中文输入法的实现
    中文输入法的实现可以通过查数据库或利用开源输入法实现,读者可以去开源网站找相关的资源

输入法插件调用

在QApplication a(argc, argv);之前

qputenv(“QT_IM_MODULE”, “tgtsml”);

测试结果

Qt5输入法实现_第3张图片

你可能感兴趣的:(qt)