我在关山口开摇摇车 2023-05-24 22:07 采纳率: 50%
浏览 84
已结题

想要在Qt写的程序中既可以使用qtvirtualkeyboard输入中文,又可以使用实体键盘和ibus输入法输入中文

想要在Qt写的程序中既可以使用qtvirtualkeyboard输入中文,又可以使用实体键盘和ibus输入法输入中文,能够接受子不同时使用,应该怎么办?Qt写的程序中要用输入法必须设置环境变量QT_IM_MODULE,但是这个环境变量已经被我设置为qtvirtualkeyboard了。
操作环境系统 Debian/Linux Qt 6.4
我尝试过
在代码中修改环境变量


```c++
qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
qputenv("QT_IM_MODULE", QByteArray("ibus"));



但是并不生效。
后来发现只有在APP构造的之前设置才是有效的。这说明APP构造的时候回去加载输入法插件。我想做的就是让它重新加载一遍新的输入法插件。
也有尝试使用

bool useQtVirtualKeyboard = ...; // 根据需要动态设置
QByteArray imModule = useQtVirtualKeyboard ? QByteArrayLiteral("qtvirtualkeyboard") : QByteArrayLiteral("ibus");
qputenv("QT_IM_MODULE", imModule);

// 获取主窗口,并从中获取当前的输入方法
QInputMethod *inputMethod = qApp->inputMethod();
if (inputMethod) {
    // 重设当前输入方法
    inputMethod->reset();
    // 通知当前输入法重新加载
    inputMethod->update(Qt::ImEnabled);
}


也不生效。


  • 写回答

7条回答 默认 最新

  • @晓码自在 2023-05-24 22:19
    关注

    该回答引用ChatGPT4与博主@晓码自在合作编写:

    从你的描述来看,要实现在Qt程序中同时使用qtvirtualkeyboard和ibus输入法,目前遇到的主要问题是:

    1. QT_IM_MODULE这个环境变量只能在APP启动前设置,启动后设置无效。
    2. 重置当前输入法和更新输入法也无法重新加载输入法插件。

    要解决这个问题,有几个思路:

    1. 在APP启动前根据需要设置QT_IM_MODULE为qtvirtualkeyboard或ibus,启动APP后无法切换。这个思路实现简单但功能较弱。
    2. 不使用QT_IM_MODULE环境变量,而是在代码中直接加载输入法插件。可以在运行时根据需要加载qtvirtualkeyboard或ibus插件,实现动态切换。
    3. 同时加载qtvirtualkeyboard和ibus两个输入法插件,并在两个输入法中实现切换逻辑。这样就无需改变环境变量和重载输入法了。

    具体实现方案,你可以:

    1. 在主窗口创建时加载输入法插件:
    cpp
    void MainWindow::loadInputMethod() {
        if (useQtVirtualKeyboard) {  // 根据需要加载
            QInputMethod* im = new QQtVirtualKeyboardInputMethod;
            qApp->setInputMethod(im);
        } else {
            QInputMethod* im = new QIbusInputMethod;
            qApp->setInputMethod(im);
        }
    }
    
    1. 同时加载两个输入法,并在输入法之间实现切换:
    cpp
    // 同时加载两个输入法
    QQtVirtualKeyboardInputMethod* im1 = new QQtVirtualKeyboardInputMethod;
    QIbusInputMethod* im2 = new QIbusInputMethod;
    
    // 设置默认输入法和备用输入法
    qApp->setInputMethod(im1);
    qApp->setInputMethod(im2, Qt::ImPrefered);  
    
    // 在两个输入法中添加切换逻辑
    void QQtVirtualKeyboardInputMethod::changeInputMethod() {
        qApp->setInputMethod(im2);   // 切换到ibus输入法
    }
    
    void QIbusInputMethod::changeInputMethod() {
        qApp->setInputMethod(im1);   // 切换到qtvirtualkeyboard输入法
    } 
    
    
    

    这样你的APP就可以同时使用两个输入法,并在它们之间灵活切换了。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月30日
  • 创建了问题 5月24日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效