fcitx5 Pyside6/PyQt6 无法中文输入问题解决

sean 编辑于2024-11-26 18:43软件相关

linux下程序,无法使用fcitx输入法输入中文,但发现切换ibus后可以输入。后来发现是pyside6/pyqt6自带支持ibus的so库,而没有fcitx5的so库。

libfcitx5platforminputcontextplugin.so这个库对应fcitx5-qt(https://github.com/fcitx/fcitx5-qt)的源码文件构建出来的。

目前我的系统是debian11, fcitx5版本是5.0.5.1, 我要构建的pyside6/pyqt6版本是6.3.2

ubuntu2204,fcitx5版本是5.0.14,

这里是我编译好debian11的动态库文件下载地址:libfcitx5platforminputcontextplugin.so

一、版本确定后可以开始配置fcitx5-qt(当前版本是5.0.16)

git clone https://github.com/fcitx/fcitx5-qt

参考网上的文章,说要先构建qt6

二.构建Qt6库

先下载qt6.3.2源码包

$ wget -c https://download.qt.io/official_releases/qt/6.3/6.3.2/single/qt-everywhere-src-6.3.2.tar.xz
或
$ wget -c https://mirrors.tuna.tsinghua.edu.cn/qt/archive/qt/6.3/6.3.2/single/qt-everywhere-src-6.3.2.tar.xz

 安装前置依赖包

sudo apt install cmake extra-cmake-modules libxkbcommon-x11-dev  libxcb-cursor0 python3-dev  portaudio19-dev patchelf  build-essential mesa-common-dev  libgl1-mesa-dev   libglu1-mesa-dev libgles2-mesa-dev

#在6.6.1里要求
sudo apt install libclang-dev libclang-14-dev

安装Qt6库,

解压,build, 安装qt6库,

配置预安装到 /opt/qt6 目录下,主要是编译用完方便删除,

--parallel 指定4, 不然占满所有cpu资源,导致死机,我是四核cpu仅供参考,这里有一个取巧的方法,因为只是需要编译fcitx5插件,只需要加上--target qtbase编译基本库 就可以 

qt6库安装完,就可以之构建fcitx5-qt了。


三、构建fcitx5-qt

1、在开始之前先安装fcitx5开发依赖包

$ sudo apt install libfcitx5utils-dev

2、进入刚才步骤一里checkout的fcitx5-qt目录,配置下根目录下的文件CMakeLists.txt

$ cd fcitx5-qt

#改成如下的形式
$ nano -w  ./CMakeLists.txt
cmake_minimum_required(VERSION 3.6.0)
project(fcitx5-qt VERSION 5.0.5)
set(FCITX5_QT_VERSION ${PROJECT_VERSION})

set(REQUIRED_QT4_VERSION 4.8.0)
set(REQUIRED_QT5_VERSION 5.1.0)
set(REQUIRED_QT6_VERSION 6.0.0)

find_package(ECM 1.4.0 REQUIRED)

set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

option(ENABLE_QT4 "Enable Qt 4" Off)
option(ENABLE_QT5 "Enable Qt 5" Off)
option(ENABLE_QT6 "Enable Qt 6" On)
option(BUILD_ONLY_PLUGIN "Build only plugin" On)
option(BUILD_STATIC_PLUGIN "Build plugin as static" Off)
option(WITH_FCITX_PLUGIN_NAME "Enable plugin name with fcitx" On)

if (BUILD_ONLY_PLUGIN)
  set(LIBRARY_TYPE STATIC)
  set(LIBRARY_COMPILE_FLAGS "-fPIC")
else()
  set(LIBRARY_TYPE SHARED)
  add_definitions(-DFCITX_GETTEXT_DOMAIN=\"fcitx5-qt\")
endif()

if (BUILD_ONLY_PLUGIN AND BUILD_STATIC_PLUGIN)
  set(PLUGIN_LIBRARY_TYPE STATIC)
else()
  set(PLUGIN_LIBRARY_TYPE MODULE)
endif()

add_definitions(-DFCITX5_QT_VERSION=\"${FCITX5_QT_VERSION}\" -DQT_NO_KEYWORDS)

include(GNUInstallDirs)
include(FeatureSummary)
include(GenerateExportHeader)
include(ECMSetupVersion)
include(ECMGenerateHeaders)
include(ECMUninstallTarget)

find_package(XCB REQUIRED COMPONENTS XCB)
find_package(XKBCommon 0.5.0 REQUIRED COMPONENTS XKBCommon)
if (NOT BUILD_ONLY_PLUGIN)
find_package(Fcitx5Utils REQUIRED)
endif()
find_package(X11 REQUIRED)

add_library(X11Import UNKNOWN IMPORTED)
set_target_properties(X11Import PROPERTIES
    IMPORTED_LOCATION "${X11_X11_LIB}"
    INTERFACE_INCLUDE_DIRECTORIES "${X11_X11_INCLUDE_PATH}")

if (BUILD_ONLY_PLUGIN)
# Dup a little bit option here.
include(CompilerSettings)
else()
include("${FCITX_INSTALL_CMAKECONFIG_DIR}/Fcitx5Utils/Fcitx5CompilerSettings.cmake")
endif()

set(Fcitx5Qt6_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/Fcitx5Qt6)
set(Fcitx5Qt5_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/Fcitx5Qt5)
set(Fcitx5Qt4_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/Fcitx5Qt4)

if(ENABLE_QT4)
  find_package(Qt4 ${REQUIRED_QT4_VERSION} REQUIRED)
  add_subdirectory(qt4)
endif()

if(ENABLE_QT5)
  find_package(Qt5 ${REQUIRED_QT5_VERSION} CONFIG REQUIRED Core DBus Widgets)
  find_package(Qt5Gui ${REQUIRED_QT5_VERSION} REQUIRED Private)
  add_subdirectory(qt5)
endif()

if(ENABLE_QT6)
  find_package(Qt6 ${REQUIRED_QT6_VERSION} CONFIG REQUIRED Core DBus)
  find_package(Qt6Gui ${REQUIRED_QT6_VERSION} REQUIRED Private)
  add_subdirectory(qt6)
endif()

if(NOT BUILD_ONLY_PLUGIN)
find_package(Gettext REQUIRED)
add_subdirectory(po)
endif()

enable_testing()
add_subdirectory(test)

feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)


这里主要是这几个地方要改,

option(ENABLE_QT4 "Enable Qt 4" Off)
option(ENABLE_QT5 "Enable Qt 5" Off)
option(ENABLE_QT6 "Enable Qt 6" On)
option(BUILD_ONLY_PLUGIN "Build only plugin" On)
option(BUILD_STATIC_PLUGIN "Build plugin as static" Off)
option(WITH_FCITX_PLUGIN_NAME "Enable plugin name with fcitx" On)

  • 只编译qt6
  • 只生成插件
  • 不需要编译成静态插件
  • 插件名字不要改动,保持开启。

3、然后要记得配置环境变量CMAKE_PREFIX_PATH让编译程序能够找到qt6库,这个地址就是步骤二里的-prefix指定的预安装地址/opt/qt6

export CMAKE_PREFIX_PATH="/opt/qt6"

4、最后,直接配置,编译,生成:

$ cmake ./
$ cmake --build .

成功后,so文件在程序目录fcitx5-qt/qt6/platforminputcontext/libfcitx5platforminputcontextplugin.so里

$ chmod 755 fcitx5-qt/qt6/platforminputcontext/libfcitx5platforminputcontextplugin.so

设置好执行权限

放到自己的虚拟环境里就ok了比如这样

$ cp fcitx5-qt/qt6/platforminputcontext/libfcitx5platforminputcontextplugin.so  /lib/python3.9/site-packages/PyQt6/Qt/plugins/platforminputcontexts/
$ cd /lib/python3.9/site-packages/PyQt6/Qt/plugins/platforminputcontexts/
$ ls 
libcomposeplatforminputcontextplugin.so  libfcitx5platforminputcontextplugin.so  libibusplatforminputcontextplugin.so  libqtvirtualkeyboardplugin.so

关于本站

肥龙软件分享的软件是本站作者开发的免费,无广告,安全可靠,绝不附带任何无关软件,绝不困绑任何插件的实用软件。如果您感觉好用,可以捐赠我们,这样我们可以有更积极的动力去改进升级软件,维持服务器运转,感谢您的捐助,谢谢!

致谢 赞赏/捐助名单

**军 ¥16.8

              2024.8.13

**华 ¥16.0

              2024.12.26

李政 ¥10.0

              2025.3.13

更新时间:2025.3.17

联系作者(邮箱)
分类