[software development] 用Qt开发的软件输入不了汉字的原因
Tofloor
poster avatar
北冥夜未央
deepin
Ecological co-builder
2023-10-23 05:36
Author

一、Qt开发的程序想要输入中文的先决条件

1、用户的电脑上要安装fcitx输入法架构。

fcitx输入法包含fcitx-frontend-qt5、libfcitx-qt5-1、deepin-fcitxconfigtool-plugin三个包。

2、开发Qt程序的QtCreator“安装目录/gcc_64/plugins/platforminputcontexts/”有libfcitxplatforminputcontextplugin.so文件。开发过程中可以动态链接进去,或者把fcitx的源码静态编译进去。

3、如果开发过程中是动态链接的,打包过程中需要把libfcitxplatforminputcontextplugin.so文件打包到“/plugins/platforminputcontexts/”目录下。

4、程序运行环境的libfcitx-qt5-1版本要和程序开发环境的版本一致,即不需要完全一样,但需要相互兼容。

二、出现无法输入中文的原因:

1、没装fcitx输入法。

这个见的不多,但是也有。可能装的是ibus或者小小输入法架构。

解决方法:安装fcitx输入法。

2、打包过程中没有把libfcitxplatforminputcontextplugin.so放入包里。

案例:太多了,大部分输入不了就是这个原因。

解决方法:把“/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/”下的libfcitxplatforminputcontextplugin.so复制或软链接到软件安装目录下的“/plugins/platforminputcontexts/”目录中(也可能直接在plugins目录下,也可能中间加几层目录)。如果复制进去还不行,原因见下一条。

3、libfcitx-qt5-1版本不兼容

案例:QtCreator4.11.1、Draftsight2019、ARES Commander 2020

解决方法:

a、等开发者重新编译软件(软件要么弃更了,要么有新版本替代了,各位愿意等就继续等吧)

b、卸载系统的新版本libfcitx-qt5-1,安装兼容的旧版本,然后apt-mark hold libfcitx-qt5-1一下。(deepin20.9系统自带的版本为1.2.6.4-1+rb2,以上三个软件兼容版本是1.0.5-1,下载地址https://theshare.lanzoue.com/b01xh6wbg 密码:9gvw)这样会导致deepin-fcitxconfigtool-plugin报错,系统无法更新,非常不建议。

c、其他地方输入文字,然后复制粘贴进去。

(自从deepin更新到V20以后这三个软件就输入不了中文了,想了这么多年,今天终于想明白,然后验证成功了~)

4、开发者在开发过程中就没考虑英语外其他语言的输入,开发环境中没有libfcitxplatforminputcontextplugin.so库文件。(这个锅得Qt公司来背,QtCreator中只内置了ibus输入法插件,没有fcitx输入法插件)

案例:Inkscape(从作者回帖子中推断)

解决方案:说服开发者在QtCreator中放fcitx输入法插件,然后打包到安装包中。(英语好的给开发者留言吧,我就算了,会用汉语就很了不起了^_^)

三、其他特殊情况

1、新版Appimage格式的GIMP中没有找到libfcitxplatforminputcontextplugin.so,但是可以输入中文,可能是把fcitx5的支持静态编译到软件中了。

2、flatpak格式软件输入不了中文

我用了几年flatpak格式软件了,到现在也没有发现它到底安装到哪里了。要是谁知道可以回帖告诉我。

Reply Favorite View the author
All Replies
阿尼樱奈奈
Moderator
2023-10-23 06:47
#1

like

Reply View the author
lon
deepin
2023-10-23 16:28
#2

Inkscape 源码或源码打传统的deb包,都可以正常输入

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2023-10-23 16:34
#3
lon

Inkscape 源码或源码打传统的deb包,都可以正常输入

那是因为编译环境里有fcitx输入法插件(即先决条件第二条)。方便的话把源码编译打包的deb共享下。

Reply View the author
dgmenghuan
deepin
2023-10-23 16:42
#4

tail

Reply View the author
lon
deepin
2023-10-23 16:48
#5

同样的环境下,做成 Appimage 就无法输入了,或者说至少现在我还做不到让它正常输入,不光这个软件,好多都是,打成UOS的格式经常性的翻译失效,所以我打的包,一般都是传统的deb包

只有UOS和乌班的deb包,我现在没有装deepin。

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2023-10-23 17:58
#6
lon

同样的环境下,做成 Appimage 就无法输入了,或者说至少现在我还做不到让它正常输入,不光这个软件,好多都是,打成UOS的格式经常性的翻译失效,所以我打的包,一般都是传统的deb包

只有UOS和乌班的deb包,我现在没有装deepin。

UOS和deepin应该可以等效。

关于Appimage包输入中文失效问题,可以参考KeepassXC里面对于输入法插件的处理方式,在启动的sh文件里面临时定义变量,加载so文件,好像就是调试模式一样(我不是专门搞编程的,只能理解成这样,以前Qt写的程序加载不了指定so文件,qtconfig失效的时候,我也是这么干的)。这个软件原来的Appimage包也输入不了中文,原因就是没放fcitx插件,放了以后没有问题。

翻译失效问题我也遇到了,还没找到解决办法,有方案了共享一下。

Reply View the author
lon
deepin
2023-10-23 19:01
#7
北冥夜未央

UOS和deepin应该可以等效。

关于Appimage包输入中文失效问题,可以参考KeepassXC里面对于输入法插件的处理方式,在启动的sh文件里面临时定义变量,加载so文件,好像就是调试模式一样(我不是专门搞编程的,只能理解成这样,以前Qt写的程序加载不了指定so文件,qtconfig失效的时候,我也是这么干的)。这个软件原来的Appimage包也输入不了中文,原因就是没放fcitx插件,放了以后没有问题。

翻译失效问题我也遇到了,还没找到解决办法,有方案了共享一下。

UOS 和 DEEPIN 依赖有很大的不同,可互用的不多

Reply View the author
北冥夜未央
deepin
Ecological co-builder
2023-10-23 20:31
#8

依赖确实是个大问题,deepin20.9里的太老了,昨天装个软件找不到依赖,网上找了个ubuntu的强行装上把系统搞崩了,还好涉及的文件不多,用live抢救回来了。

appimage虽然可以隔离运行,但是不能安装,没有软件源统一升级,体验太差了。

要是可以实现优先调用软件所在目录的库文件,找不到的时候再找系统目录的就好了。好像Windows就是这么定义查找顺序的。

Reply View the author
Ziggy
deepin
2023-10-25 09:23
#9

libfcitxplatforminputcontextplugin.so这个库其实是fcitx带的,而且有这个包"fcitx-frontend-qt5",只是不清楚为什么v23上没有被自动依赖

图片.png

一般qt的plugins和样式、框架有关,像fcitx这种很明显涉及第三方库的大概率不会是qt产出的

像libfcitxplatforminputcontextplugin.so这种qt plugins库其实不太建议随便暴力放置在该归属的目录里,因为如果Qt的主版本号变动过大,有可能这个库就存在不兼容的情况了,不过好在v23和20.9均属于5.15体系,像UOS那种基于5.11如果把5.15环境下的qt plugins库强行单独拉走,就可能会有plugins兼容问题导致加载失败

Reply View the author
怪獣唻孒怎庅刅
deepin
2024-01-16 17:02
#10

大家好,我在ubuntu上用dockerfile制作debian镜像,上面安装了qt环境的各个包,但是输入不了中文。dockerfile里fcitx5和fcitx5-chinese-addon但是没有用,容器内fcitx5根本没启动,提示Failed to create addon: dbus Failed to connect to session dbus。按照网上的方法应该没有生效。以下是我的dockerfile,麻烦大佬们帮忙看看是什么问题。

FROM debian:stable

# 合并apt命令,设置Locale和中文语言包,同时清理
RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y \
        locales \
        apt-utils \
        cmake \
        g++ \
        gcc \
        qtdeclarative5-dev \
        qtbase5-dev \
        qttools5-dev \
        qtmultimedia5-dev \
        libqt5svg5-dev \
        libqt5charts5-dev \
        libqt5sql5-psql \
        libqt5serialbus5-dev \
        libqt5serialbus5-plugins \
        libqt5websockets5-dev \
        libqt5quickcontrols2-5 \
        libqt5multimedia5 \
        libqt5multimedia5-plugins \
        qml-module-qtquick-controls2 \
        qml-module-qtquick2 \
        qml-module-qtmultimedia \
        qml-module-qtgraphicaleffects \
        qml-module-qtcharts \
        qml-module-qtgstreamer \
        gstreamer1.0-libav \
        libgstrtspserver-1.0-dev \
        libpq5 \
        libpqxx-dev \
        libavcodec-dev \
        libavutil-dev \
        libswscale-dev \
        xcb \
        x11-xserver-utils \
        libgstreamer1.0-0 \
        libgstreamer-gl1.0-0 \
        libqt5gstreamerui-1.0-0 \
        libqt5gstreamer-dev \
        libqt5gstreamerquick-1.0-0 \
        libgl1-mesa-dri \
        libqt5webchannel5 \
        libqt5webchannel5-dev \
        libqt5webengine5 \
        libqt5webenginecore5 \
        libqt5webengine-data \
        libqt5webenginewidgets5 \
        libqt5webview5 \
        libqt5webview5-dev \
        qml-module-qtwebsockets \
        qml-module-qtwebview \
        qml-module-qtwebchannel \
        qml-module-qtwebengine \
        qtwebengine5-dev \
    && sed -i -e 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen \
    && locale-gen \
    && update-locale LANG=zh_CN.UTF-8 \
    && apt-get autoremove -y \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 卸载 fcitx、ibus
RUN apt-get update && \
    apt-get remove --purge -y fcitx ibus && \
    apt-get autoremove -y && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 安装 fcitx5 和 fcitx5-chinese-addons
RUN apt-get update && \
    apt-get install -y fcitx5 fcitx5-chinese-addons && \
    apt-get autoremove -y && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 设置环境变量
RUN echo "GTK_IM_MODULE=fcitx" >> /etc/environment \
    && echo "QT_IM_MODULE=fcitx" >> /etc/environment \
    && echo "XMODIFIERS=@im=fcitx" >> /etc/environment \
    && echo "SDL_IM_MODULE DEFAULT=fcitx" >> /etc/environment

ENV LANG=zh_CN.UTF-8
ENV LANGUAGE=zh_CN:zh
ENV LC_ALL=zh_CN.UTF-8

Reply View the author