QT Linux下无法使用CTRL+ALT+P快捷键,不生效

文章目录

      • 一、背景
      • 二、排查
        • (1)检查创建,发现没问题。
        • (2)查看 shortcutMap 是否注册
        • (3)排查xcb有没有获取到该事件
        • (4)排查是否是系统的问题
        • (5)www.google.com
        • (6)xcb可以正常获取到键值
        • (7)继续调试 qt 代码
        • (8)被拦截
        • (9)谁拦截
        • (10)fcitx
        • (11)解决
          • 1、通过fcitx配置工具修改
          • 2、通过配置文件修改

一、背景

该快捷键在 Windows 中是被 Microsoft Office中使用,我们的程序为了和它保持统一,也是使用的该快捷键方式,在 Window 中是正常的,但在 Linux 下,使用该快捷键无效,虽然使用的是一套代码,但在不同平台下某些插件的实现还是有差异的。

二、排查

(1)检查创建,发现没问题。

代码中使用了 QShortcut 类添加快捷键,绑定激活信号,槽函数执行动作。QShortcut 创建后,会将其添加到全局变量 shortcutMap ,在 qguiapplication_p.h 文件中定义。在代码中打印后,也确实发现了包含了该快捷键。

QKeySequence keySeq(Qt::ControlModifier + Qt::AltModifier + Qt::Key_P);
QShortcut *pShortcut = new QShortcut(keySeq, parent); 
connect(pShortcut, &QShortcut::activated, this, [=](){});

(2)查看 shortcutMap 是否注册

每次按键后,qt从xcb事件分发器收集key事件后,都会尝试去捕获有没有注册的快捷键,这里可以打印到用户所有注册到shortcutMap中的快捷键。打印后,包含该快捷键。

bool QShortcutMap::tryShortcut(QKeyEvent *e)
{
    Q_D(QShortcutMap);
    if (e->key() == Qt::Key_unknown)
        return false;
	
	QVector<QShortcutEntry> vec = d->sequences;
	for (int i = 0; i < vec.size(); i++)
	{
		qDebug() << vec[i].keyseq;
	}
	...
}

(3)排查xcb有没有获取到该事件

xcb是Linux下的底层系统库,所有的鼠标,键盘事件都从这个库收集上来,qt会对所有的事件进行转换为qt内部定义的事件,然后分发给应用程序。如果xcb都没有获取到,那肯定不是应用程序能够兼容的。还是从这个函数内加打印信息,查看到当次按键的键码描述符和键码。

结果:按下CTRL+ALT+P后,键码值是16777219,理论上应该是80,因为上一个键是O,是正常的,其值是79。所以怀疑是xcb底层获取的有问题。

bool QShortcutMap::tryShortcut(QKeyEvent *e)
{
    Q_D(QShortcutMap);
    if (e->key() == Qt::Key_unknown)
        return false;
	
	qDebug() << __FUNCTION__ << e->key() << e->modifiers();
	...

(4)排查是否是系统的问题

旁边同事有的机器是ok的,有的不行。而且测试机x64、arm、也有问题,排除架构的问题。ubuntu和麒麟v10也有问题排除系统。xfce和gnome也有问题排除桌面环境的问题。


(5)www.google.com

有人遇到了这个问题,也是该快捷键不生效,可能是clipit这个软件造成的原因,其在低版本会占用并锁定五个快捷键,导致它和别的软件都不能使用。在clipit最新的版本修复了这个问题,或者卸载该程序,使用其他程序代替。而我的电脑恰好有这个软件,导致xcb获取错误。

CTRL+ALT+O
CTRL+ALT+P
CTRL+ALT+H
CTRL+ALT+F
CTRL+ALT+A

tips:可以使用xev程序检测,按CTRL+ALT+P,发现P键值为空,什么信息都没有,显示两行0。如果未被锁定,其显示正常的键值,比如下图Shift_L为50。

在这里插入图片描述


(6)xcb可以正常获取到键值

不想升级这个程序,我直接卸载了,然后通过xev检测,发现可以抓取到该快捷键,通过调试qt 程序,发现,tryShortcut函数可以正常获取到该事件了,但是应用程序依然无法使用。


(7)继续调试 qt 代码

1、将xcb事件转换为qt内部的事件

在这里插入图片描述

2、qt再将内部事件转发下去。


3、如果keyEvent也是个handleShortcutEvent,则将其转发到快捷键事件中。

在这里插入图片描述4、尝试发送快捷键

在这里插入图片描述5、对shortcutMap进行查询,如果匹配到注册的,就发送激活信号。

在这里插入图片描述
tips:如果是正常的链路,则是按如下调用方式。

tryShortcut() => nextState() => find() => dispatchEvent()
尝试调用快捷键 => 状态机查询匹配 => 查找快捷键 =>分发事件(通过CoreApplication::sendEvent)


(8)被拦截

最上层void QXcbKeyboard::handleKeyEvent,获取到了正确的快捷键事件,但是传递到后面就没有了,怀疑是被拦截了,调试代码后最终发现,在调用filterEvent中被拦截了。

在这里插入图片描述

(9)谁拦截

linux qt平台下,集成了两种输入法,我当前环境是fcitx,所以走的是上面。而ok的同事使用的是ibus输入法,所以应该是fcitx过滤了。

在这里插入图片描述

在这里插入图片描述


(10)fcitx

qt中包含了两个fcitx版本的接口,分别是org.freedesktop.portal.Fcitxorg.fcitx.Fcitx-0,我的本机使用了第二种,它会通过QDUBS去请求,看是否会过滤,其结果通过processKeyEventResult返回,返回true,说明fcitx内部进行了处理,qt层不用处理了,需要过滤,那么该事件就被reset,那么也就收不到了。如果fcitx没处理,那么通过forwardEvent,将其发送。

在这里插入图片描述

(11)解决

猜测fcitx内部占用了该快捷键,取消即可,自己的应用程序就能使用了。

1、通过fcitx配置工具修改

在这里插入图片描述

2、通过配置文件修改

如果fcitx config tool版本过低,可以通过配置文件修改

sudo vim ~/.config/fcitx/config
// 将这一行
#SwitchPreedit=CTRL_ALT_P
// 改为这一行,保存后,重启电脑即可
SwitchPreedit=

tips:#必须去掉,虽然注释了,fcitx依然会使用默认该快捷键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/374521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10英寸安卓车载平板电脑丨ONERugged车载工业平板:解决农业工作效率

农业是人类社会的基石之一&#xff0c;而农业工作效率的提升一直是农民和农业专业人士关注的重要议题。随着技术的不断进步&#xff0c;车载工业平板成为了解决农业工作效率的创新解决方案。本文将探讨车载工业平板如何为农业带来巨大的改变&#xff0c;提高农民的工作效率和农…

Fink CDC数据同步(六)数据入湖Hudi

数据入湖Hudi Apache Hudi(简称&#xff1a;Hudi)使得您能在hadoop兼容的存储之上存储大量数据&#xff0c;同时它还提供两种原语&#xff0c;使得除了经典的批处理之外&#xff0c;还可以在数据湖上进行流处理。这两种原语分别是&#xff1a; Update/Delete记录&#xff1a;H…

【Java 数据结构】泛型进阶

泛型 1 什么是泛型2 引出泛型2.1 语法 3 泛型类的使用3.1 语法3.2 示例3.3 类型推导(Type Inference) 泛型是如何编译的擦除机制裸类型4 泛型的上界4.1 语法4.2 示例4.3 复杂示例 5 泛型方法5.1 定义语法5.2 示例5.3 使用示例-可以类型推导5.4 使用示例-不使用类型推导 6 通配符…

编译原理与技术(三)——语法分析(五)自底向上-LR分析

一、自顶向下的LL(1)与自底向上的LR &#xff08;一&#xff09;LL(1)非递归预测分析器及分析表 &#xff08;二&#xff09;LR分析器及分析表 二、LR分析 举个例子。 从上面不难看出&#xff0c;LR分析也是由分析表驱动的。那么关键在于构造LR分析表。

眼动追踪系统体验实验(脑与认知期末考核)

实验名称&#xff1a;眼动追踪系统体验实验 实验目的&#xff1a; 本实验旨在通过体验脑与认知眼动追踪系统&#xff0c;了解该技术在心理学、认知科学等领域的应用&#xff0c;理解它是怎样工作的&#xff0c;探究眼动追踪技术如何揭示人类认知过程的奥秘。 实验环境&#…

1、将 ChatGPT 集成到数据科学工作流程中:提示和最佳实践

将 ChatGPT 集成到数据科学工作流程中:提示和最佳实践 希望将 ChatGPT 集成到您的数据科学工作流程中吗?这是一个利用 ChatGPT 进行数据科学的提示的实践。 ChatGPT、其继任者 GPT-4 及其开源替代品非常成功。开发人员和数据科学家都希望提高工作效率,并使用 ChatGPT 来简…

docker之程序镜像的制作

目录 一、每种资源的预安装&#xff08;基础&#xff09; 安装 nginx安装 redis 二、dockerfile文件制作&#xff08;基础&#xff09; 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像&#xff08;方式一&#xff09; 生成centos容器并…

环境配置:Udacity的Self-Driving项目安装运行

前言 Udacity的自动驾驶工程师纳米学位项目&#xff08;Self-Driving Car Engineer Nanodegree Program&#xff09;是一项面向学习者的前沿技术项目&#xff0c;旨在提供全面的自动驾驶工程师培训。该项目由Udacity与自动驾驶领域的领先公司和专业人士合作开发&#xff0c;涵…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

安卓9宫格密码键盘

自定义组件 package com.zx.mocab.views;import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent…

adb push 将电脑中的文件传输到安卓开发板

1. adb remount 重新挂载设备的文件系统&#xff0c;以便可以对设备进行读写操作&#xff0c;通常情况下&#xff0c;安卓开发板在连接到计算机后&#xff0c;设备的文件系统会被挂载为只读文件系统&#xff0c;重新挂载后变成可读可写权限 C:\Users\Administrator>adb re…

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势

工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比&#xff0c;工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现&#xff0c;并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…

2月6日作业

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识&#xff1b; c. 学会自我思考&#xff0c;提升认知&#xff0c;不要只会模仿&#xff1b; 课程内容 1. Fine-Tuning 有什么作用&#xff1f; a. 什么是模型训练&#xff…

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

掌握Pandas数据转换利器深入解析pd.to_numeric函数与实战技巧【第63篇—python:Pandas数据】

文章目录 引言pd.to_numeric函数简介参数详解实战案例进阶应用&#xff1a;处理缺失值与异常值1. 处理缺失值2. 处理异常值 高效利用downcast参数优化内存占用优化性能&#xff1a;使用apply函数批量处理数据实战案例&#xff1a;处理时间序列数据处理多列数据&#xff1a;结合…

知识管理平台有哪些?帮助企业高效发展

在现代商业环境中&#xff0c;知识被认为是推动企业高效发展的关键因素。一个有效的知识管理平台可以帮助企业收集、整理和分享知识&#xff0c;从而提高工作效率&#xff0c;增强竞争优势。接下来&#xff0c;我将向大家推荐三款优秀的知识管理平台&#xff1a;Helplook&#…

Python初学者学习记录——python基础综合案例:数据可视化——动态柱状图

一、案例效果 通过pyecharts可以实现数据的动态显示&#xff0c;直观的感受1960~2019年世界各国GDP的变化趋势 二、通过Bar构建基础柱状图 反转x轴和y轴 标签数值在右侧 from pyecharts.charts import Bar from pyecharts.options import LabelOpts# 构建柱状图对象 bar Bar()…

理解“无意义的”JavaScript特性

概要 JavaScript可能是世界上最流行的客户端语言&#xff0c;但它远非完美&#xff0c;也不是没有怪癖。Juan Diego Rodriguez研究了几个“荒谬的”JavaScript怪癖&#xff0c;并解释了它们是如何进入语言的&#xff0c;以及如何在自己的代码中避免它们。 特性 为什么JavaS…

【并发编程】手写线程池阻塞队列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 示意图 步骤1&#xff1a;自定义任务队列 变量定义 用Deque双端队列来承接任务用ReentrantLock 来做锁并声明两个条件变量 Condition fullWai…