最近在学着用python和qt写GUI程序,用PyQt5时可以调出输入法,可是换成PySide2时却不行。我的系统是Ubuntu 21.04,KDE桌面,输入法基于fcitx5。
搜索时我从1了解到qt需要通过输入法插件才能调用输入法,需要把输入法提供的库文件放在qt的插件目录的子目录platforminputcontexts
里面。我的qt5库安装在
/usr/lib/x86_64-linux-gnu/
下,由
dpkg --listfiles libqt5core5a
可以看到。qt5的输入法插件目录是
/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts
这是运行
find / -type f -name "*platforminputcontextplugin.so" 2>/dev/null
找到的。里面确实有参考文献提到的输入法库文件,实际上有如下几个:
libcomposeplatforminputcontextplugin.so
libibusplatforminputcontextplugin.so
libfcitx5platforminputcontextplugin.so
libqtvirtualkeyboardplugin.so
我查了下fcitx5, 发现fcitx5给qt5的插件由包fcitx5-frontend-qt5
提供。我也稍微查了下ibus,没查到ibus给qt5的插件由哪个包提供。不过如果用的是ibus, 我估计没有输入法调不出的问题。貌似是qt自带了ibus的插件(我的PySide6的相关路径和后来编译的qt6的相关路径里确实有ibus的插件)。我换ibus的话是可以调出输入法的。
PySide2的输入法插件的目录是
~/.local/lib/python3.9/site-packages/PySide2/Qt/plugins/platforminputcontexts
(我是pip
安装的)。只要把前面的
libfcitx5platforminputcontextplugin.so
拷贝到或者符号链接到这个目录下就可以调用输入法了。要测试行不行,当然写段最简单的代码就行了,比如窗口就一个QLineEditor
的小脚本。
为了让fcitx5支持PySide6或PyQt6, 我一开始试了直接复制qt5的fcitx5插件,不行。搜了搜后发现github上fctix5提供了qt6的插件,地址是https://github.com/fcitx/fcitx5-qt。插件自然依赖于qt6且编译需要qt6编译时的一些cmake文件(PySide6的Qt目录下虽然有Qt6的库文件等,但是没有cmake文件),所以我们需要安装Qt6. 安装见附录。我的安装目录是/opt/Qt6
. 之后就可以编译fcitx5-qt了。
我用的cmake-gui生成makefile. 作为cmake的门外汉,还是GUI上手快点。cmake-gui里点击configure会列出一些变量,可以填写来配置。命令行cmake可以用-D来设置,不过我一开始不知道有哪些,只能等报错(虽然gui也要等)。后来知道CMakeCache.txt
这个文件中有。实际上我是交错使用cmake和cmake-gui时才摸清了一下东西的。
使用cmake-gui, 一开始要选源文件目录和build目录。然后点击configure,让变量显示出来,可以设置。下面是我在cmake-gui下的设置,选中的是我设置过的(有些是我设置后cmake确定的),其他要么是默认的要么是cmake自动搜索确定的。
其他项还好些,主要是要通过qt6安装目录指定cmake文件位置的项。第一次点configure后有关qt6安装目录的指定cmake文件位置的变量只有Qt6_DIR, 我设置成了如图所示。第二次点configure的时候,出错了,qt6目录相关变量一部分是确定了,但是一部分没确定,要手动填进去。这样一两次后,报错的区域不会出现了,configure就成功了。然后点generate在fcitx5-qt的build目录生成makefile. 有了makefile, 就可以进入fcitx5-qt的build目录里make了,之后子目录qt6/platforminputcontext
下面就有
libfcitx5platforminputcontextplugin.so
这个文件了。如前一节所言放到PySide6的合适的位置即可。可以make install
安装到qt6的安装目录下(我的需要sudo),如果像我一样把CMAKE_INSTALL_PREFIX
设成了qt6的安装目录的话。直接复制我估计也行。
这个Qt的官方文档说的很清楚。假设我们的工作目录是~/Downloads
:
cd ~/Downloads
一开始是装依赖:
sudo apt install libfontconfig1-dev libfreetype6-dev libx11-dev libx11-xcb-dev libxext-dev libxfixes-dev libxi-dev libxrender-dev libxcb1-dev libxcb-glx0-dev libxcb-keysyms1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-util-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev libxkbcommon-x11-dev
接下来下载源代码:
wget -c https://download.qt.io/official_releases/qt/6.1/6.1.2/single/qt-everywhere-opensource-src-6.1.2.tar.xz
我的PySide6和PyQt6里的qt版本都是6.1.2, 所以我下了6.1.2. 不过我觉得只要是6版本都不影响fcitx5-qt里面qt6插件的编译。
解压
tar xf qt-everywhere-opensource-src-6.1.2.tar.xz
这样我们就有了源代码的目录qt-everywhere-src-6.1.2
. 建立build目录
mkdir qt6-build && cd qt6-build
运行
qt-everywhere-src-6.1.2/configure -prefix /opt/Qt6
其中/opt/Qt6
是qt6的安装目录。现在可以开始编译了:
cmake --build . --parellel
这样的target很多,编译要几个小时。如果你不需要那么完整的安装,可以只安装基本的:
cmake --build . --parallel --target qtbase
这对于编译fcitx5-qt就足够了。如果需要其他的,可以以后再编译。编译好后,终端还提示了要configure和build其他Qt模块,可以用Qt安装目录下bin/qt-configure-module
这个脚本。
最后就是安装到/opt/Qt6
了(这个目录需要sudo):
sudo cmake --install .
官方文档还提到了设置路径以便qt6的bin里面的工具和lib里面的库文件能被检索到。如果只是编译fcitx5-qt插件,这个可以不要。
Qt程序无法输入中文的问题 ↩︎