Qt开发过程中经常用到软键盘,自己做了个软键盘,记录笔记,方便自己以后查看,有需要的可以参考
Qt输入法实现方式有很多种,这里只介绍输入法插件方式的实现
话不多说,进入正题
输入法插件的创建
-
工程文件
新建工程,模板选择lib,QT模块需要添加gui-privateQT += 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 ¶mlist); };
其中QPlatformInputContextFactoryInterface_iid 在qplatforminputcontextplugin_p.h中声明,test.json是保存插件名字的json文件,其内容如下:
{
“Keys”: [ “testPlugin” ]
}关于宏Q_PLUGIN_METADATA的解释请移步Qt帮助文档:How to Create Qt Plugins
函数create()的实现:TestContext * TestPlugin ::create(const QString &key, const QStringList ¶mlist) { 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);
示例:
-
中文输入法的实现
中文输入法的实现可以通过查数据库或利用开源输入法实现,读者可以去开源网站找相关的资源
输入法插件调用
在QApplication a(argc, argv);之前
qputenv(“QT_IM_MODULE”, “tgtsml”);
测试结果
来源:CSDN
作者:tgtsml
链接:https://blog.csdn.net/time_forget/article/details/103463053