首页 > 其他分享 >QScintilla代码跳转时indicator工作不正确的问题

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

时间:2022-11-21 11:31:32浏览次数:69  
标签:indicator 这个 函数 QScintilla 跳转 我们 光标


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

目标:

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

问题:

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

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

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

 

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

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

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

解决过程:

为了知道本质问题,当然是追踪源码。就跟我遇到的这个问题一样 ​​编辑器库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) 函数执行的才做我们的光标跳转操作)。

QScintilla代码跳转时indicator工作不正确的问题_置位_03

 

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

 

 


而这个函数是在


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


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

QScintilla代码跳转时indicator工作不正确的问题_置位_05

 

标签:indicator,这个,函数,QScintilla,跳转,我们,光标
From: https://blog.51cto.com/u_13682052/5873198

相关文章

  • 关于编辑器QScintilla(Scintilla)词法分析器工作原理的分析(实现注释区分)
    入门,首先看我这两篇博客:关于QScintilla库的入门大全正式开始,先来看看词法分析器和编辑器的关系:(注意:如果自己重写一个词法分析器,那么用的是继承另一个类 QsciLexerCustom ......
  • Vue跳转路由后回到顶部
    在使用Vue3写个人博客时,点击一篇博客之后我想要跳转到文章详情界面,但是跳转后该页面位置还停留在上一个路由时的位置,而实际上是需要跳转后回到顶部。解决方法为,为路由添......
  • BOM案例_自动跳转首页和DOM概述
    案例_自动跳转首页分析:1.显示页面效果<p>2.倒计时读秒效果实现定义一个方法,来获取span标签,修改span标签体内容定义一个定时器,1秒执行一......
  • 解决SPA单页面应用(create-react-app,Vue-cli)路由跳转后404的问题。
    在Nginx中配置try_filesserver{listen80;server_namelocalhost;root"****";location/{ try_files$uri$uri/......
  • 通过代码跳转路由
    <template><divid="app"><button@click="toHome">首页</button><buttonto="/about"@click="toAbout">关于</button><!--相当于占位符--><r......
  • idea 设置vue@跳转
    第一步:根目录下面,创建一个JS文件,名字随便起config.js/*此文件未使用,只是为了让idea可以识别实际位置*/constpath=require('path');functionresolve(dir){returnpa......
  • 视频直播app源码,react 编程式导航实现页面跳转
    视频直播app源码,react编程式导航实现页面跳转一介绍编程式导航:通过js代码来实现页面跳转 案例:点击登录按钮,登录成功后,通过代码跳转到后台首页,如何实现? 答......
  • Freenom注册失败的处理,recaptcha跳转
    好久都注册不成功,查了几家,什么代理,什么美国地址都是没用的,和上次一样,recaptcha无法正常访问造成的。安装一个浏览器的扩展程序,Gooreplacer。安装教程:1.打开谷歌浏览器的更......
  • react的基础跳转传参
    小插曲:   获取自定义json数据    可以打开终端 npm i axios(下载axios) 在componentDidMount() (相当于挂载完成)这个生命周期里面得到数据,例如:Impor......
  • 不用app实现shopify跳转亚马逊
    shopify跳转亚马逊Amazon的方式有很多种,如果不用app实现shopifyredirecttoAmazon呢?安装app一般都会带有附加文件从而降低网站加载速度,而速度是用户体验/转化率很重要的......