QScintilla代码跳转时indicator工作不正确的问题

news2025/7/11 9:32:41

首先看我这几个文章,知道一下indicator是什么,以及上下文:

https://biao2488890051.blog.csdn.net/article/details/126798996?spm=1001.2014.3001.5502

目标:

我现在要做按住 ctrl + 鼠标左键点击释放 发生函数/变量的 定义/声明的 跳转功能(eclipse,vscode,qtcreator它们都有这个功能,我们当然也得有)。原理就是给标识符赋一个indicator,然后这个indicator释放会产生一个信号,我们关联这个信号,进行目标跳转处理即可。

问题:

但是现在出现的问题,跳转本文件内,会发生一大段选中的情况,而且光标位置没有变动。???

而跳转到其它文件就没问题。这个问题其实QScintilla那个教程作者自己也遇到了,但是他也不知道是什么原因:https://qscintilla.com/#click_and_jump/editor_py 

所以我这个博客现在来分析和给出了真正的原因。

 

我做的这个跳转功能图片如下: 

解决过程:

为了知道本质问题,当然是追踪源码。就跟我遇到的这个问题一样 编辑器库QsciScintilla的indicator点击没有按键信息的bug解决_我是标同学的博客-CSDN博客

 

根据现象,猜测这个问题,是由于indicator释放信号先触发,我们在槽函数中改变了光标位置,然后弹起结束时候qsci执行的光标被Qsci重新置位。所以先看看这个indicator释放信号在哪发射的,一路追踪下去:

结合我们之前遇到这个问题博客,可以知道在函数 

void Editor::ButtonUpWithModifiers(Point pt, unsigned int curTime, int modifiers) 

中发射的信号。我们的 NotifyIndicatorClick(false, newPos.Position(), 0); 函数之后,还有大量的函数调用,这些函数大概功能就是判断是否选择了文本,然后重新绘图等操作。

原因:

所以问题就在这,因为我们在NotifyIndicatorClick函数里(也就是我们关联indicator释放信号的槽函数中去了,因为qt同线程的信号和槽函数是直接连接,即立刻执行的)把光标的位置从鼠标按下的位置改到了我们跳转的位置,而且此时鼠标一直是按下的状态,此时后面这些函数(它们认为的旧光标在原来位置)就会认为我们做了文本选择(过程等效于:从跳转位置,按下鼠标,光标到了原位置,所以这个过程当然会是选择文本的操作了),所以就会把文本选择给重绘出来了。

解决方法:

因此,我们在NotifyIndicatorClick函数里不能急着把光标给设置到新位置去,而是先让后面这些函数运行完,再去设置光标到新位置。这个怎么实现呢???有两种方法:

方法1:

在NotifyIndicatorClick函数里(其实就是我们的indicator释放信号的槽函数中),我们设置一个定时器触发我们的光标设置函数,这样就是 后面这些函数运行完 ,我们的光标设置函数才执行的。这样就可以了。关于这个定时时间多少,只要>0即可,这样就不是立即串行执行的就行。QScintilla那个教程作者自己也遇到了同样的这个问题,他不知道具体原因是什么,但是他也是这样解决了https://qscintilla.com/#click_and_jump/editor_py

方法2:

不用这个indicator释放信号了,而是我们自己去editor的鼠标弹起事件函数里面,去处理,这样也是 后面这些函数运行完 ,我们的光标设置函数才执行的(因为我们在事件函数里先让 QsciScintillaBase::mouseReleaseEvent(QMouseEvent *e) 函数执行的才做我们的光标跳转操作)。

 

 

 


而这个函数是在

// Handle a mouse button releases.
void QsciScintillaBase::mouseReleaseEvent(QMouseEvent *e)

中调用的,如下图:(这个函数没什么东西)

 

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

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

相关文章

Pandas中你一定要掌握的时间序列相关高级功能

💡 作者:韩信子ShowMeAI 📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40 📘 本文地址:https://www.showmeai.tech/article-detail/389 📢 声明:版权所有,转…

ceph浅谈

总谈 ceph简介 用上ceph,多台机器的磁盘空间在一起了,在一台机器上就可以看到使用所有空间。 还可以保存多份安全备份 存储先ceph,自我管理修复,跨机房,节点越多,并行化,论上,节点越…

【虚幻引擎UE】UE5 实现相机录制视频并导出(C++调用外部exe)

说明: 该功能暂不支持导出声音。 由于OpenCV3和UE5不太兼容,因此考虑制作外部exe实现视频合成。 一、创建渲染目标 二、创建Actor加场景捕获组件2D 三、创建UE5内的C++代码 1、实现 SavePicToFile 导出图片蓝图函数 .cpp文件 // Fill out your copyright notice in the De…

数字集成电路设计(二、Verilog HDL基础知识)

文章目录1. 语言要素1.1 空白符1.2 注释符1.3 标识符1.3.1 转义标识符1.4 关键字1.5 数值1.5.1 整数及其表示方式1.5.2 实数及其表示方式1.5.3 字符串及其表示方式2. 数据类型2.1 物理数据类型2.1.1 连线型2.1.2 寄存器型2.2 连线型和寄存器型数据类型的声明2.2.1 连线型数据类…

深入了解海豚调度DolphinScheduler

深入了解海豚调度DolphinScheduler一、海豚调度介绍二、海豚调度特性三、建议配置四、名词解释五、模块介绍六、功能介绍1.项目首页2.工作流定义3.工作流实例4.任务实例5.任务定义七、任务类型1.SQL2.SPARK节点3.Apache Zeppelin八、集群部署1.前置准备工作2.准备 DolphinSched…

实现注册与登录模块

目录 1、加载依赖 2、实现jwt工具类jwtUtil类 3、实现config.filter.JwtAuthenticationTokenFilter类 4、配置config.SecurityConfig类 5、创建后端api之前对数据库进行修改 6、写API一共需要的三个地方 7、实现三个接口 8、验证用户登录用API调试 9、https://jwt.io/解…

MySQL表的增删查改(CRUD)

文章目录前言一、新增数据二、查询数据全列查询指定列查询表达式查询指定别名查询去重查询排序查询条件查询分页查询三、修改数据四、删除数据前言 CRUD代表: 增加(create) ,查询(retrieve) ,更新(update) ,删除(delete) 单词首字母。 一、新增数据 SQL使用insert关键字来表…

二叉搜索树、红黑树详解、红黑树高的应用、TreeMap的应用(图文详解)-Kotlin版本代码

二叉搜索树 何为二叉搜索树? 二叉搜索树是一种特殊的二叉树,它的左子节点总是小于或等于根节点,而右子节点 总是大于或等于根节点。 如下图,即是一颗二叉搜索树。 对于二叉搜索树来说,中序遍历可以遍历按照节点值…

【JavaSE】重载和重写

前言: 作者简介:爱吃大白菜1132 人生格言:纸上得来终觉浅,绝知此事要躬行 如果文章知识点有错误的地方不吝赐教,和大家一起学习,一起进步! 如果觉得博主文章还不错的话,希望三连支持&#xff01…

python--敲击木鱼积累功德小项目(更新版(2))

前言:前几天上课闲着没事写了一个python敲击木鱼积累功德的小项目,当时纯粹就是写着玩,回顾一下鼠标事件的东西还记不记得,发现这个博客的点赞和收藏量还挺高的,我当时也没有把它当回事,后面也有很多人问怎…

11.11一些资源整理和总结

使用python读取tensorboard文件中的数据并写入到excel当中去能够代替Originlab的画图软件(macos)Mac款origin来了!还不来看看!ptflops:计算网络参数FLOPs的工具[github] 4 中方式计算 FLOPs(知乎&#xff0…

栈和队列实现的思路和代码

栈和队列第一节----栈什么是栈实现栈的基本思路各个接口函数的实现初始化栈销毁栈压栈出栈返回栈顶元素栈的判空栈的大小第二节----队列什么是队列实现队列的基本思路各个接口函数的实现队列的初始化队列的销毁队列的插入队列的删除返回队头元素和队尾元素队列的判空队列的大小…

使用DESeq2进行转录组原始count标准化和差异分析

转录组测序完成后,一般我们会获得一个原始 read count表达矩阵,其中行是基因,列是样品。常用的差异分析工具包括limma、edgeR和DESeq2。DESeq2在测序领域使用最为广泛(google scholar引用高达43284次,edgeR为28076次&a…

MYSQL索引查询问题质疑

前言 我们在写mysql查询语句的时候,尤其是经验不足的同学肯定会想要怎么使用索引加快查询,或是我这样写到底会不会命中索引。那么现在我就列举几个常见的索引查询问题进行简单说明一下。(欢迎互怼!) 1.问&#xff1a…

小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法

小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法前言游戏界面按钮实现事件实现的三种方法1、按钮定义及事件3种方法1.1 按钮定义1.2三种事件引用方法1.2.1 类法1.2.2 事件方法2,自定义方法函数1.2.3 事件方法3,使用装饰器处理onclick事件1.3 效果图1.4 代码…

第十四届蓝桥杯校模拟赛详解+代码(一)

“须知少时凌云志,自许人间第一流” 鄙人11月八号有幸参加学校蓝桥杯校选拔赛,题型为5道填空题,5道编程题,总时间为4小时。奈何能力有限,只完成了5道填空和3道编程大题,现进行自省自纠,分享学习…

艾美捷细胞计数试剂盒-8(CCK-8),一步到位

艾美捷细胞计数试剂盒-8(CCK-8):用于简单准确的细胞增殖和细胞毒性测定的比色试剂盒。 艾美捷细胞计数试剂盒-8(CCK-8)特点: 1、一步到位,不含放射性同位素的即用溶液 2、与[3H]-胸苷掺入试验…

分销商城平台哪个好_分享分销商城开发步骤

微信分销商城平台分为两种: 第一种是入驻到别人的微信分销商城平台里面,帮助分销别人发布的商品从而获得佣金。 第二种情况是自己公司开发的微信分销商城平台,然后招募分销者进行分销公司的产品。 对于大家来讲肯定是自己公司开发的微信分销商…

数据结构与算法_大数据处理_求topK的两种求解方法

这篇笔记记录求大数据topk的两种方法,分别是大小二叉堆法和快速分割法,下面依次详解这两种方法的过程。 1 大/小根堆法 利用大根堆过滤前top k小的数据**;小根堆过滤前top k大的数据**; 下面用大根堆求前k个小元素为例。 思想&…

Python 算法:学习二分法

二分法,一个看似简单,逻辑易懂的算法,但是初次接触可能会有很多坑!主要是边界处理的问题。 下面以一个耳熟能详的案例来展开: 案例描述: 小B从1~100之间(含边界值)任意想一个数字&a…