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依然会使用默认该快捷键。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP 粘包/拆包

文章目录 概述粘包拆包发生场景解决TCP粘包和拆包问题的常见方法Netty对粘包和拆包问题的处理小结 概述 TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中&#xff0c;比如RPC框架、Netty等 TCP 粘包/拆包 就是你基于 TCP 发送数据的时候&#xff0c;出现了多个字符串“粘”…

前端页面禁止debugger调试并跳转空白页面----文心一言官网实现方式

技术点&#xff1a;setInterval定时器Object.defineProperty 背景&#xff1a; 某天打开文心一言想看看接口返回结构是怎样的&#xff0c;熟练的打开浏览器开发者工具查看网络请求。 发现出现了以下debugger断点 这难不倒我&#xff0c;去掉断点调试&#xff0c;继续下一步不…

MyBatis多数据源以及动态切换实现(基于SpringBoot 2.7.x)

MyBatis多数据源以及动态切换实现可以实现不同功能模块可以对应到不同的数据库&#xff0c;现在就让我们来讲解一下。 目录 一、引入Maven二、配置文件三、实现多数据源四、动态切换数据源 一、引入Maven 注意&#xff1a;博主这边使用的springboot版本是2.7.14的 <!-- htt…

LeetCode:26.删除有序数组中的重复项

26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 思路&#xff1a; 代码注释&#xff1a; 每日表情包&#xff1a; 题目&#xff1a; 思路&#xff1a; 没啥特殊的&#xff0c;老老实实双指针遍历数组&#xff0c;&#xff0…

获取旁站 / C 段:第三方网站(附链接)

一、介绍 1.1 旁段 在网络安全的上下文中&#xff0c;"旁段"&#xff08;Pivot&#xff09;是指攻击者通过入侵一个网络中的一台计算机&#xff0c;然后利用该计算机作为跳板&#xff08;或者称之为“旁道”&#xff09;来访问其他计算机或网络资源的行为。 攻击者…

如何启动若依框架

Mysql安装 一、下载 链接&#xff1a;https://pan.baidu.com/s/1s8-Y1ooaRtwP9KnmP3rxlQ?pwd1234 提取码&#xff1a;1234 二、安装(解压) 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)&…

虚幻5源码版打包服务端

适用情况&#xff0c;windows系统&#xff0c;已经安装vs2022之类的&#xff0c;和UE5适配的版本 源码版使用 1.下载源码版&#xff0c;推荐下载 压缩包 tar.gz那个&#xff0c;zip和git clone我老是下载不下载来&#xff0c;只是这个压缩包要解压1个多小时… 2.点击 源码的…

【RT-DETR有效改进】利用SENetV1重构化网络结构 (ILSVRC冠军得主)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合…

自动暂停和恢复网页中的视频播放

序言 在日常开发中&#xff0c;有时候一级栏目可能是个H5页面&#xff0c;当切换到其他栏目的时候需要自动暂停H5中的视频&#xff0c;切换回来以后需要自动恢复播放。实现的思路是通过JS来操作&#xff0c;难点是感知fragment的可见状态。还有js代码的编写。 比如下面这个页…

PyTorch的10个基本张量操作

PyTorch是一个基于python的科学计算包。它的灵活性允许轻松集成新的数据类型和算法&#xff0c;并且框架也是高效和可扩展的&#xff0c;下面我们将介绍一些Pytorch的基本张量操作。 Tensors 张量Tensors是一个向量&#xff0c;矩阵或任何n维数组。这是深度学习的基本数据结构…

DevExpress WinForms中文教程 - 如何创建可访问的WinForms应用?(二)

为用户创建易访问的Windows Forms应用程序不仅是最佳实践的体现&#xff0c;还是对包容性和以用户为中心的设计承诺。在应用程序开发生命周期的早期考虑与可访问性相关的需求可以节省长期运行的时间(因为它将决定设计决策和代码实现)。 一个可访问的WinForms应用程序提供了各种…

20240202在Ubuntu20.04.6下使用whisper.cpp的显卡模式

20240202在Ubuntu20.04.6下使用whisper.cpp的显卡模式 2024/2/2 19:43 【结论&#xff1a;在Ubuntu20.04.6下&#xff0c;确认large模式识别7分钟中文视频&#xff0c;需要356447.78 ms&#xff0c;也就是356.5秒&#xff0c;需要大概5分钟&#xff01;效率太差&#xff01;】 …

CleanMyMac2024如何识别并清理垃圾文件?

CleanMyMac识别并清理垃圾文件的过程主要依赖于其强大的扫描功能和智能算法。以下是具体的步骤&#xff1a; 扫描垃圾文件&#xff1a;首先&#xff0c;用户需要打开CleanMyMac软件&#xff0c;并点击“智能扫描”功能。然后&#xff0c;软件将开始自动扫描Mac系统上的各种垃圾…

微信小程序(基本操作)

概念&#xff1a; 小程序&#xff1a;就是小程序&#xff0c;mini program。现在市面上有微信小程序&#xff0c;百度智能小程序等等。 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了…

5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720&#xff0c;其中加减速各90 加速段&#xff1a;加速类型&#xff1a;S曲线  加速角度&#xff1a;角度为90  起步速度…

CSS太极动态图

CSS太极动态图 1. 案例效果 我们今天学习用HTML和CSS实现动态的太极&#xff0c;看一下效果。 2. 分析思路 太极图是由两个旋转的圆组成&#xff0c;一个是黑圆&#xff0c;一个是白圆。实现现原理是使用CSS的动画和渐变背景属性。 首先&#xff0c;为所有元素设置默认值为0…

Topaz Photo AI for Mac v2.3.1 补丁版人工智能降噪软件无损放大

想要将模糊的图片变得更加清晰&#xff1f;不妨试试Topaz Photo AI for Mac 这款人工智能、无损放大软件。Topaz Photo AI for Mac 一款强大的人工智能降噪软件&#xff0c;允许用户使用复杂的锐化算法来提高图像清晰度&#xff0c;还包括肖像编辑选项&#xff0c;如面部重塑、…

Visual Studio 2010+C#实现信源和信息熵

1. 设计要求 以图形界面的方式设计一套程序&#xff0c;该程序可以实现以下功能&#xff1a; 从输入框输入单个或多个概率&#xff0c;然后使用者可以通过相关按钮的点击求解相应的对数&#xff0c;自信息以及信息熵程序要能够实现马尔可夫信源转移概率矩阵的输入并且可以计算…

Netty源码系列 之 EventLoop run()方法 源码

EventLoop[实现类为NioEventLoop&#xff0c;我们研究NioEventLoop即可] EventLoop是一个单线程的线程池 核心作用&#xff1a;处理执行IO操作&#xff08;accept&#xff0c;read&#xff0c;write事件&#xff09;&#xff0c;普通任务&#xff0c;定时任务 EventLoop封装…

精酿啤酒:发酵过程中的温度控制与效果

在啤酒酿造过程中&#xff0c;发酵温度的控制重要&#xff0c;它不仅影响酵母菌的活性&#xff0c;还决定了啤酒的口感、香气和风味。对于Fendi Club啤酒来说&#xff0c;切确控制发酵温度是确保啤酒品质和口感的关键环节。 在Fendi Club啤酒的发酵过程中&#xff0c;温度控制尤…