“麒麟V10上折腾 Qt6 的兄弟,多半都被同一个问题卡过:Qt 程序跑起来了,界面也正常,但搜狗输入法一敲键盘就是没反应。这个问题在 Qt5 时代基本不存在,到了 Qt6 就特别明显,尤其是自己手动安装 Qt 6.7.3 的工程模式,几乎十有八九要踩一遍。网上能搜到的经验多是 Ubuntu、Arch 这类发行版,放到国产 ARM/x86 平台上一套,经常对不上号。这篇文章就把整个流程从零捋一遍,从海光、兆芯这类 amd64 平台到华为 9000x 这种 arm64 平台,把 Qt 6.7.3 安装、fcitx 编译和搜狗输入法联动一次性搞明白,适合正在做信创适配的开发者、嵌入式和桌面应用移植人员参考。
我用麒麟V10分别在海光C86、兆芯KX-6000和华为9000x三台机器上复现过同样的流程,结论是思路完全一致,只有少数和 CPU 架构相关的细节不同。下面会逐段拆开讲,每一步都会说明为什么这么做,而不是只给一条命令让你复制粘贴。能少走很多弯路。
1. 问题拆解:为什么 Qt6 就是打不了中文
1.1 麒麟V10的输入法生态现状
麒麟V10作为一款基于 Linux 内核的国产桌面操作系统,默认带了 fcitx 输入法框架,厂商定制版一般还会顺带装搜狗输入法。这里面有个容易忽略的前提:搜狗输入法和输入法框架是两个层面的东西。搜狗只是一个输入法引擎,负责把拼音转成候选字,真正和 Qt 程序打交道、接收按键事件、弹出候选框的,是 fcitx 这个框架本身。换句话说,搜狗得挂在 fcitx 上才能工作,fcitx 再向 Qt 提供输入上下文。
Qt 程序想要接收 fcitx 的输入,不是说系统装了 fcitx 就行,而是 Qt 里必须加载一个叫 platforminputcontext 的插件。这个插件的作用是让 Qt 的窗口系统模块和 fcitx 通过 DBus 或共享内存通信,把键盘事件和输入法状态互相传递。默认 Qt 并不会内置对应 fcitx 的插件,所以要靠额外的 fcitx-qt5 或 fcitx-qt6 包来提供。
1.2 Qt5到Qt6的输入法桥接变化
Qt5 时代,麒麟V10的原生仓库里通常已经带了编译好的 fcitx-qt5 包,装完 Qt5 只要设置好 QT_IM_MODULE=fcitx,输入法就能工作。但 Qt6 出来后情况变了,麒麟V10发布较晚,仓库里的 fcitx 相关支持模块基本停留在 Qt5,没有预编译的 fcitx-qt6 插件。加上 Qt6 本身在输入法抽象层做了调整,强制在 QPlatformInputContext 这个架构下工作,导致很多直接从 Qt5 迁过来的程序,连输入上下文都建立不起来,表现出来就是光标正常但输入法不弹窗,或者弹出来一直在英文状态。
还有一个坑是 Wayland 和 X11 的会话差异。麒麟V10如果跑的是 X11,Qt6 走 xcb 平台插件;如果跑了 Wayland,则加载 wayland 插件。fcitx 在这两种会话下走的消息通道不一样,X11 下依赖 XMODIFIERS 环境变量,Wayland 下依赖 text-input 协议。很多老教程都默认 X11,结果在 Wayland 环境里一通配置也没用。建议统一用 X11 会话做 Qt 开发验证,最稳。
1.3 手动安装Qt6遇到的额外障碍
官方源码包和在线安装器装出来的 Qt6,目录结构和麒麟自带的库习惯不同。特别是 Qt6.7.3 这种新版本,你在官方下载页面能看到很多预编译包,但那些包是按照通用 Linux 发行版编译的,直接解压到麒麟上,gcc 版本、libxcb 依赖、fontconfig 版本不一定完全匹配。如果你的系统 GCC 太老,某些 Qt 模块可能在运行期报 undefined symbol 错误,甚至会反过来影响输入法插件加载。
最典型的一个场景:编译器版本是 GCC 9,Qt 6.7.3 的某些库需要 GCC 11 以上的 ABI 兼容,结果程序能跑但加载 fcitx 插件时崩溃。海光和兆芯的桌面版麒麟系统默认 GCC 版本通常不高,这一点后面编译 fcitx-qt6 时也要小心。
2. 环境底座的确认:先搞清楚 CPU 架构和工具链
2.1 架构检测和基础依赖判断
不管你是海光还是兆芯,跑起来基本都是 amd64 指令集,但海光部分早期的桌面 CPU 支持的是 x86-64-v2,兆芯 KX-6000 同样也是 x86-64-v2 级别。华为 9000x 则完全是 arm64,跑的是 aarch64 架构。这中间最大的差别不在于安装步骤差别多大,而在于你下载的 Qt 二进制包、编译 fcitx 时用的编译选项和生成的库文件名是否匹配。
建议开始前先用命令确认好环境,避免拿错安装包:
uname -m # x86_64 或 aarch64 cat /proc/cpuinfo | grep 'model name' | head -n1 # 海光、兆芯、鲲鹏/昇腾等麒麟V10的版本也建议查一下,用cat /etc/kylin-release看是银河麒麟还是星光麒麟,两者的软件源和包管理策略有细微区别。处理 Qt6 输入法问题时,银河麒麟服务器版和桌面版的差异最关键,服务器版可能完全没有图形配置工具,桌面版则有完整的输入法配置面板。
2.2 工具链和编译器的准备
编译 fcitx-qt6 需要的依赖,比想象中要少,但每个都不能缺。我整理了一下最关键的几项:
- cmake:最好 3.16 及以上,麒麟V10默认源的 cmake 版本可能偏低,建议自己装一个新版。
- gcc/g++:必须支持 C++17;Qt6.7 的库有些用了 C++17 特性。
- libxkbcommon-dev:键盘映射库,fcitx 在前端处理 XKB 时必须用到。
- libglib2.0-dev:DBus 通信需要 GLib 主循环支持。
- Qt6Base 开发包:如果你是用源码安装的 Qt6,需要在 CMake 里能找到 Qt6Config.cmake。
- libdbus-1-dev:fcitx 的 DBus 接口依赖。
如果准备自己编译 Qt6 而不是用官方二进制,那还要加上 libxcb 这一整套依赖,比如 xcb-util-cursor、xcb-util-keysyms、xcb-util-wm。这里建议不要自己编 Qt 6.7.3 的全套库,实在太费时间,海光架构上我试过一次,大概花了两小时多,加上后续排查,效率远不如直接用官方编译好的包加少量补丁。
2.3 是否要在容器里做隔离
很多桌面系统怕把自带的 Qt5 环境弄坏,想用 docker 跑 Qt6。这里要特别提醒:如果你的 Qt6 程序要接搜狗输入法,必须直接跑在宿主机的图形会话里,容器里输入法框架基本无法工作。容器可以解决编译依赖冲突,但运行期输入法需要访问宿主的 X11/DBus socket,即便映射过去,fcitx 的进程权限也很容易出问题。除非你用 VNC 或者独立 xvfb 跑无头测试,否则不建议走容器化路线。
我自己的做法是在麒麟V10宿主机上建一个独立的工作目录,把 Qt6 装到一个 /opt/qt6 下面,和系统自带库完全隔离。这样即使 Qt6 跑挂了,也不会影响系统桌面自带的 Qt5 应用。
3. Qt 6.7.3 安装的实操路径
3.1 选择官方二进制包还是源码编译
先说结论:新装麒麟V10,如果只是为了跑业务程序,直接下载 Qt 6.7.3 官方预编译包,选 Linux x86_64 或者 Linux arm64 那一套,解压就能用。预编译包是用 GCC 编译的,麒麟V10桌面版一般带有兼容的运行时库,日常运行问题不大。
但如果是自己开发 Qt 程序,我建议做一次源码编译。原因很简单:预编译包自带的 Qt6 Core 模块用的 glibc 版本可能高于麒麟自带版本,编译产物放到客户机器上会有兼容性风险。源码编译虽然慢,但最终生成的库是打在当前系统的 glibc 和 C++ ABI 上的,遇到输入法插件的符号匹配问题会少很多。
网上最高效的做法是只编译需要的模块,不要整个 Qt 全编。输入法关联的是 qtbase,而 Qt Widgets 模块也在这个仓库里。命令行大致如下:
git clone --depth 1 --branch v6.7.3 https://github.com/qt/qtbase.git cd qtbase ./configure -prefix /opt/qt6 \ -opensource -confirm-license \ -nomake examples -nomake tests \ -skip qtwayland \ -xcb -system-freetype -system-libpng cmake --build . --parallel 4 cmake --install .这样编出来的 Qt6 核心库,已经包含了 xcb 平台插件和大部分基础依赖。注意如果你的系统缺 OpenGL 头文件,configure 阶段可能自动禁用某些模块,一般不影响输入法。若编译过程中提示libxkbcommon找不到,先手动安装对应开发包再重新 configure。
3.2 环境变量配置和版本切换
安装完成后,Qt6 qmake 的路径在 /opt/qt6/bin/qmake。很多开发者习惯把 Qt5 和 Qt6 共存,这里建议不要动系统的 PATH,而是写一个环境脚本,只在终端会话里生效:
export PATH=/opt/qt6/bin:$PATH export QT_ROOT=/opt/qt6 export QT_PLUGIN_PATH=/opt/qt6/plugins export QML_IMPORT_PATH=/opt/qt6/qml export LD_LIBRARY_PATH=/opt/qt6/lib:$LD_LIBRARY_PATH export QT_IM_MODULE=fcitx # 关键变量,后面会解释 export XMODIFIERS=@im=fcitx export GTK_IM_MODULE=fcitxQT_PLUGIN_PATH 这个变量很多人忽略。Qt 程序的插件搜索路径默认是编译时写死的,如果你把 Qt6 解压到 /opt/qt6,那么在普通 shell 里启动应用,插件路径应该是 /opt/qt6/plugins。但如果你是通过系统自带的启动器或者桌面快捷方式启动,qt.conf 文件没配置好,程序就可能跑到系统 Qt5 的插件目录找插件。输入法插件加载失败,很多时候就是路径不对,而不是 fcitx 本身的问题。
3.3 快速验证 Qt6 是否正常
在折腾输入法之前,先确认 Qt6 基本环境是好的。写一个只有几行的 QWidget 程序,编译运行,看窗口能否弹出、能不能用鼠标焦点。一个最简单的测试方法是用 Qt 自带的小例子:
/opt/qt6/examples/widgets/tetrix 2>/dev/null如果没有 examples,可以直接用命令行:
/opt/qt6/bin/qmake -query上面命令会输出 Qt6 的安装信息,检查QT_INSTALL_IMPORTS和QT_INSTALL_PLUGINS路径是否正确。如果这两项路径指向系统路径而不是 /opt/qt6,那就是 configure 阶段参数出问题了,输入法插件安装到别的目录去了。
4. fcitx 框架编译和 Qt6 模块打通
4.1 系统已有 fcitx 的确认
麒麟V10桌面版出厂一般自带 fcitx 和搜狗输入法,启动后能看到托盘图标。但有的精简版或服务器版会去掉输入法,这时候需要先确认:
dpkg -l | grep fcitx或者:
fcitx-diagnosefcitx-diagnose是 fcitx4 的看家工具,输出非常详细,直接拉到最后看Qt IM Module部分,会显示 Qt5 和 Qt6 的输入法模块状态。如果在 Qt6 对应项里显示not found,那就是缺少 fcitx-qt6 插件,和我前面说的问题一致。
注意:麒麟V10上默认的 fcitx 版本可能是 4.x,而不是 fcitx5。搜狗输入法主要兼容 fcitx4 的接口。fcitx5 虽然也能挂搜狗,但个别版本有兼容性问题,比如候选框不跟随光标。建议保留系统自带的 fcitx4 版本,不要贸然升级。
4.2 编译 fcitx-qt5 和 fcitx-qt6 模块
fcitx 官方仓库里有两个独立的项目:fcitx-qt5 和 fcitx-qt6,分别提供 Qt5 和 Qt6 的输入法插件。麒麟系统原生带了 fcitx-qt5,但 fcitx-qt6 没有。处理方法是去 fcitx 的 GitHub 仓库拉 fcitx-qt6 源码,本地编译安装。源码很小,大概就几十兆,编译也快。
我用的是 fcitx-qt6 项目的稳定分支,编译命令大致如下:
git clone --depth 1 https://github.com/fcitx/fcitx-qt6.git cd fcitx-qt6 cmake -B build \ -DCMAKE_PREFIX_PATH=/opt/qt6 \ -DCMAKE_BUILD_TYPE=Release cmake --build build -j4 sudo cmake --install build这里关键参数是 CMAKE_PREFIX_PATH,必须指向 Qt6 的安装目录,否则 cmake 会乱找 Qt 版本。如果编译时提示找不到 Qt6Config.cmake,大概率就是 CMAKE_PREFIX_PATH 没设置对,可以用下面命令手动查:
find /opt/qt6 -name "Qt6Config.cmake"安装完成后,会在 /opt/qt6/plugins/platforminputcontexts 目录下生成libfcitxplatforminputcontextplugin.so文件。检查一下:
ls -l /opt/qt6/plugins/platforminputcontexts/能看到libfcitxplatforminputcontextplugin.so就说明编译成功。这一步是整个流程的核心,很多人的 Qt 程序输入法不生效,就是缺这个文件。
4.3 环境变量和 DBus 会话的关联
fcitx 依赖 DBus 和全局键盘钩子。编译完插件后,必须把三个环境变量设好:
export QT_IM_MODULE=fcitx export GTK_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx这些变量最好写进用户的~/.bashrc或~/.profile,不要只写在当前终端,因为 Qt 程序可能是从桌面快捷方式启动的。如果是用桌面快捷方式,需要在.desktop文件的 Exec 行前加env QT_IM_MODULE=fcitx,才能真正生效。
还要检查当前会话里 DBus 是否可用。麒麟V10默认是用户级 DBus,普通程序启动时一般会自动连接。如果 fcitx 进程起来了,但输入法状态同步不了,可以重启一下 fcitx:
fcitx -r &-r参数表示重启输入法进程,并重新加载配置。这招在调试阶段很好用,省得来回注销登录。
4.4 编译过程中容易混淆的 QT_PLUGIN_PATH 问题
如果你把 fcitx-qt6 通过 cmake 默认安装,它可能不会装到 /opt/qt6/plugins 下面,而是装到系统 Qt5 的插件目录。这是因为 fcitx-qt6 的 CMake 脚本里会读取 Qt6 的安装信息,理论上不该错,但如果你用的是一个解压版的 Qt6,没跑过 sudo make install,那 Qt6 的路径信息可能没有注册到系统的 cmake 包里。这时候 fcitx-qt6 编译时找不到 Qt6,退而求其次用了 Qt5,然后把插件生成到 fcitx-qt5 的目录,结果 Qt6 程序根本不会去加载它。
所以编译前确认一下:用cmake -LA build | grep QT_QMAKE_EXECUTABLE查看当前使用的 qmake 路径。必须显示/opt/qt6/bin/qmake,而不是/usr/bin/qmake。如果有误,清理掉 build 目录,重设 CMAKE_PREFIX_PATH 再编。
5. 搜狗输入法联调:从框架到可用
5.1 验证搜狗输入法本身是否正常
在 Qt 程序之前,先在系统自带的文本编辑器里测试,比如 Gedit 或 Pluma。如果系统编辑器能输入中文,说明 fcitx + 搜狗这个组合没问题,焦点问题就集中在 Qt 上。如果系统编辑器也不能输入中文,那先别管 Qt,先把输入法配置弄好。
麒麟V10自带的搜狗输入法安装包,一般在软件源里有,也可以去搜狗官网下载对应麒麟架构的 deb 包。我建议优先用软件源里的版本,因为厂商针对麒麟做过适配,比如处理了 fcitx 配置文件的路径差异。手动下载的 deb 包安装后,可能出现输入法管理工具里看不到搜狗,或者候选框皮肤对不上的问题。
安装完搜狗后,确认 fcitx 的配置文件里能列出搜狗:
fcitx-configtool界面里应该有搜狗输入法,并且勾选启用。如果没有,点击界面左下角的加号手动添加。
5.2 Qt程序里激活中文输入的完整配置
解决了底层插件后,Qt 程序里通常就能直接切中文了。但有个小细节:部分程序需要在代码里显式启用输入法上下文。用 QWidget 开发的程序还好,默认支持;用 Qt Quick/QML 写的程序,如果 TextInput 控件没有设置inputMethodHints: Qt.ImhNone,在某些场景下输入法候选框不会弹出,尤其是全屏无边框窗口。
如果遇到 QML 程序输入法不生效,可以在焦点控件上设置:
TextInput { focus: true inputMethodHints: Qt.ImhNone // 其它属性 }这个问题在传统 x86 平台和 ARM 平台上表现一样,和架构无关,纯属 Qt 输入法上下文的激活机制导致。
5.3 候选框定位和皮肤问题
fcitx-qt6 插件编译好后,默认候选框位于屏幕底部,和 Qt 程序光标的跟随由 fcitx 负责。麒麟V10上,如果候选框位移,多半是 fcitx 的前端设置里的follows-cursor选项没开。修改方式是在 fcitx 的配置文件里:
[Behavior] follows-cursor = True修改完重启 fcitx。这个问题在 HiDPI 屏幕上更明显,因为 Qt6 的缩放比例和 fcitx 的坐标计算如果不一致,候选框会偏到屏幕边缘。专门做 HiDPI 适配的兄弟,建议先把麒麟的显示缩放调成 1x,测试输入法定位是否准确,确认插件工作正常后再调回缩放。
5.4 测试用例:一个不信邪的典型场景
这是我踩过的一个典型案例。某跨平台系统从 Qt5 迁移到 Qt6.7.3,结果发现程序里 QLineEdit 能输入,但 QTextEdit 不能。排查半天,原因是 QTextEdit 内部用了富文本框架,加载了一个 QTextDocument,这个 Document 和输入法上下文绑定得比 QLineEdit 慢,导致输入法事件没有正确分发。Qt6 的输入法上下文激活时机比 Qt5 更快,会忽略掉一些晚到的 focus-in 事件。
解决方案很笨但有效:在 showEvent 里强制刷新焦点:
void MyTextEdit::showEvent(QShowEvent *event) { QWidget::showEvent(event); clearFocus(); setFocus(); }这个方法治标不治本,但对多数输入法失效场景能立刻见效。类似的技巧在 X11 环境下特别管用。
6. 海光、兆芯与华为 9000x 架构适配细节
6.1 三种 CPU 的共性处理
海光、兆芯在系统信息里都显示为 x86_64,跑讲解 amd64 的通用二进制没有任何问题。华为 9000x 是 aarch64,需要单独的 arm64 编译包。但在输入法这件事上,三者的处理路径几乎完全一致:Qt6 都是同一个源码,fcitx-qt6 也都是同一个源码,编译出的插件类型不同,但配置方法相同。
有一点需要特别注意:海光和兆芯的 CPU 虽然同为 x86_64,但指令集上限不一样。兆芯 KX-6000 不支持部分 AVX512 指令,而 Qt 官方预编译在 x86_64 的包里可能启用了较新的指令集。如果程序运行时出现 SIGILL 死机,那就不能直接用官方二进制包,得用源码编译 Qt,编译时加上-march=x86-64-v2之类的参数,降低指令集要求。
华为 9000x 上则没有这个问题,因为 Qt 的 arm64 预编译包始终围绕 ARMv8 基础指令集,兼容性很稳。
6.2 构建脚本差异和参数选择
海光和兆芯上编译 fcitx-qt6 时,cmake 参数和我前面写的一样,不需要加特殊的架构参数。华为 9000x 上理论上也一样,但要注意交叉编译的情况。如果你的宿主开发机是 x86,目标机是华为 9000x,那你必须用交叉工具链,比如 aarch64-linux-gnu-gcc,这时候 fcitx-qt6 的 CMake 会变得很麻烦。个人建议直接用华为机器作为构建机,本地编本地用,速度也够快,省去交叉编译的路径问题。
如果确实要交叉编译,需要把 Qt6 的 arm64 二进制包也放在开发机上,然后在 CMAKE 参数里指定 sysroot:
cmake -B build \ -DCMAKE_TOOLCHAIN_FILE=/path/to/aarch64-toolchain.cmake \ -DCMAKE_PREFIX_PATH=/opt/qt6-arm64 \ -DCMAKE_BUILD_TYPE=Release这个坑很深,一般不建议为了输入法去碰。
6.3 Qt6 二进制包在麒麟V10上的崩溃排查
不管是海光还是华为,如果你下载的 Qt6 二进制运行时报错,先检查系统 glibc 版本。用ldd /opt/qt6/lib/libQt6Core.so.6看依赖,里面如果出现GLIBC_2.33找不到,说明系统 glibc 版本太低。麒麟V10 桌面版一般 glibc 2.28 或 2.31,遇到这种问题只能编译 Qt6 的对应模块,或者换一个较旧的 Qt6 版本。
输入法插件本身也可能出现这种问题。如果 fcitx-qt6 编译时链接了系统的 libstdc++,而 Qt6 二进制是自己编译的,两者 gcc 版本不一致,可能导致 symbol 冲突。避开的方法是统一编译工具链:Qt6 用哪个 gcc 编译,fcitx-qt6 也用同一个 gcc。这一点在麒麟V10上尤其重要,因为系统里往往同时装了 gcc9、gcc10、gcc11 多套工具链。
6.4 华为 9000x 的特定注意事项
华为 9000x 机器上,如果使用官方 ARM64 版 Qt6 预编译包,默认的 Qt 插件路径在/usr/local/Qt-6.7.3/plugins或者你解压的目录。fcitx-qt6 编译时同样通过 CMAKE_PREFIX_PATH 指向这个目录。其余不变。
另外一个不太常见但实际遇到的问题:华为 9000x 的一些机器使用 Wayland 会话,而且是默认的,不是 X11。这会导致 xcb 插件无效。Qt6 程序在 Wayland 下加载的是 wayland 插件,fcitx-qt6 编译出来的平台插件是否能被 wayland 加载,取决于 Qt6 是否编译了 wayland 支持。如果你用的是官方预编译包,里面的 wayland 插件可能缺失。解决方式有两种:直接用 X11 登录会话,或者确保 Qt6 里 wayland 插件存在。
对于鲲鹏 9000x 机器,我更推荐直接用 X11 会话,因为麒麟V10对 Wayland 的稳定性支持还没有到生产级别,输入法在 Wayland 下的表现偶尔会出现莫名不弹候选框的问题。
7. 问题速查表和避坑总结
7.1 常见故障及排查命令
我把实际遇到过的故障整理成一个速查表,方便兄弟们现场直接对照:
| 现象 | 排查点 | 处理办法 |
|---|---|---|
| Qt6 程序启动,搜狗候选框不弹 | 检查 QT_IM_MODULE 是否正确 | echo $QT_IM_MODULE,确保为 fcitx |
| fcitx 托盘图标在但输入法无反应 | 重启 fcitx | 运行fcitx -r &并重新切换输入法 |
| 插件文件缺失 | 查看 platforminputcontexts 目录 | 重编 fcitx-qt6,确认安装路径 |
| Qt6 直接崩溃 | 看dmesg中的 SIGSEGV 或 glibc 报错 | 检查 Qt6 的编译器 ABI 和依赖版本 |
| 候选框不跟随光标 | 配置 fcitx 行为 | 设置follows-cursor = True,重启 fcitx |
| 搜狗不见了 | 检查 fcitx 配置工具 | 用fcitx-configtool重新添加搜狗 |
| 海光/兆芯运行 SIGILL | CPU 不支持较新指令集 | 用-march=x86-64-v2重新编译 Qt |
| 华为 9000x 无法切中文 | 可能是 Wayland 会话 | 把登录会话切到 X11 |
7.2 调试日志获取和定位技巧
fcitx 有四套日志渠道,排查问题时不用瞎猜:
- fcitx 自身日志:运行
fcitx-diagnose,看开头的系统信息、环境变量、DBus 状态。 - Qt 插件加载日志:设置环境变量
QT_DEBUG_PLUGINS=1,启动 Qt 程序时会打印插件加载全流程,能看到 fcitx 插件是否被尝试加载、加载失败的具体原因。 - DBus 日志:用
dbus-monitor看 fcitx 和 Qt 之间的消息是否发送,这对排查输入法事件很有用。 - 系统日志:
journalctl -u fcitx或者直接看~/.config/fcitx/log/下的 fcitx 日志文件。
这些日志比猜配置靠谱得多。我记得第一次在麒麟上搞定 fcitx-qt6,就是靠QT_DEBUG_PLUGINS=1定位到插件路径加载错,而不是在环境变量里反复折腾。
7.3 一些说多了都是泪的经验
我个人的实际感受是,这个问题的难点并不在于 Qt 6.7.3 本身有多难装,而在于麒麟V10预装的 Qt5 环境和手动装的 Qt6 会产生路径上的互相干扰。系统里同时存在两套 Qt 平台插件时,程序只要稍微加载错目录,输入法就完全失效。最稳妥的方案是把 Qt6 完全独立安装,不要动系统默认的 Qt5,也不要尝试用一个公共目录强行合并两套库。
另一点是要养成编译前清理 build 目录的习惯。fcitx-qt6 的 CMake 缓存很顽固,如果之前编译时不小心连到了 Qt5,你哪怕改了 CMAKE_PREFIX_PATH,只要 build 目录不删,cmake 还是会沿用旧的 Qt5 路径。踩过几次坑之后,我在改参数前都直接rm -rf build,重新配置,这样反而比来回调参数更省时间。
最后提一个小技巧:麒麟V10如果是在虚拟机里测试,尽量把内存调到 4GB 以上,fcitx 和搜狗的进程本身也就几百 MB,但 Qt6 编译时如果内存不足,OOM 杀掉编译进程会导致半成品库,之后找问题能找一晚。我在一台 2GB 的虚拟机里编译过 fcitx-qt6,编译过程看着完成了,但实际缺了几个符号,后来又重新编了一遍才好,白白耗了一个晚上。