PySide应用无法调出输入法输入中文

最近在学着用python和qt写GUI程序,用PyQt5时可以调出输入法,可是换成PySide2时却不行。我的系统是Ubuntu 21.04,KDE桌面,输入法基于fcitx5。

qt的输入法插件

搜索时我从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安装fcitx5输入法插件

PySide2的输入法插件的目录是

~/.local/lib/python3.9/site-packages/PySide2/Qt/plugins/platforminputcontexts

(我是pip安装的)。只要把前面的

libfcitx5platforminputcontextplugin.so

拷贝到或者符号链接到这个目录下就可以调用输入法了。要测试行不行,当然写段最简单的代码就行了,比如窗口就一个QLineEditor的小脚本。

给Pyside6或PyQt6安装fcitx5输入法插件

为了让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自动搜索确定的。

PySide应用无法调出输入法输入中文_第1张图片
其他项还好些,主要是要通过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的安装目录的话。直接复制我估计也行。

附录:安装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插件,这个可以不要。


  1. Qt程序无法输入中文的问题 ↩︎

你可能感兴趣的