QsciScintilla编辑器从任意坐标拿到正确的行号

news/2025/2/12 22:10:38/

QSci官方API函数是:

    //! Returns the line which is at \a point pixel coordinates or -1 if there
    //! is no line at that point.
    int lineAt(const QPoint &point) const;
 

然而,当鼠标位置为空行的位置,此时拿到的行号总是-1,这个是不符号我们期望的。

查看其源码发现,里面用的是 SCI_POSITIONFROMPOINTCLOSE 这个宏,其实需要换另一个宏 SCI_POSITIONFROMPOINT 就可以了。说明这里的CLOSE表示是否封闭行,也就是是否有可见字符,或者用官方的话说是有效行

所以新的函数写法是:

//这个函数才能拿到空行的行号,而api函数QsciScintilla::lineAt在空行位置拿到的行号总是-1
int Editor::lineFromPos(QPoint pos)
{//根本原因在这里应该用SCI_POSITIONFROMPOINT,而不是SCI_POSITIONFROMPOINTCLOSElong chpos = SendScintilla(SCI_POSITIONFROMPOINT, pos.x(), pos.y());if (chpos < 0)return -1;return SendScintilla(SCI_LINEFROMPOSITION, chpos);
}

源码追踪:

想了解前因后果,看我这个博客:关于编辑器QScintilla(Scintilla)词法分析器工作原理的分析(实现注释区分)_我是标同学的博客-CSDN博客_qscintilla

如果我们追踪一下源码,可以发现Scitinall官方 Editor.cpp文件

	case SCI_POSITIONFROMPOINT:return PositionFromLocation(Point::FromInts(static_cast<int>(wParam) - vs.ExternalMarginWidth(), static_cast<int>(lParam)),false, false);case SCI_POSITIONFROMPOINTCLOSE:return PositionFromLocation(Point::FromInts(static_cast<int>(wParam) - vs.ExternalMarginWidth(), static_cast<int>(lParam)),true, false);//核心就是这个函数,其实就是y坐标除以文本每行的高度,加上顶部行即可,也很简单的
Sci::Line Editor::LineFromLocation(Point pt) const {return pcs->DocFromDisplay(static_cast<int>(pt.y) / vs.lineHeight + topLine);
}

//核心就是这个函数,其实就是y坐标除以文本每行的高度,加上顶部行即可,也很简单的。


http://www.ppmy.cn/news/3674.html

相关文章

MobSDK引进相关问题

1、进入全球领先的数据智能科技平台-MobTech袤博mob官网 首先注册帐号、核验身份、选择开发者平台 2、创建项目的appkey和对应的appSecret 进入开发者模式后&#xff0c;对应以下几个选项模块&#xff08;以短信验证模块为例&#xff09;&#xff0c;点击开始使用 跳转到个人…

《自己动手写CPU》学习记录(9)——第7章/Part 2

目录 引言 致谢 流水线暂停 指令说明 madd、maddu、msub、msubu 设计 宏定义文件 程序计数器模块 译码模块 执行模块 访存模块 HI LO 寄存器模块 通用寄存器模块 流水线控制模块 程序ROM MIPS32顶层 MIPS32 SOPC 仿真 仿真程序 TESTBENCH 仿真结果 引言 …

ELK (一)部署ELK+Filebeat日志收集分析系统

说明&#xff1a;此安装流程只适用于8.0.0以下的版本 1. ElasticSearch 部署 1.1 下载ElasticSearch的wget指令&#xff1a; wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-linux-x86_64.tar.gz1.2 解压安装包到指定目录 指定解压缩到 …

第4篇:嵌入式Linux应用开发基础知识

嵌入式Linux应用开发基础知识一、GCC编译过程二、MakefileMakefile的引入及规则Makefile的语法a. 通配符b. 假想目标: .PHONYC. 变量Makefile函数函数foreach函数filter/filter-outWildcardpatsubst函数Makefile实例通用MakefikeMakefikeMakefile.build说明.txt三、TCPserver.c…

[附源码]Python计算机毕业设计Django架构的博客平台设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

深度学习——使用图像增广进行训练CIFAR10代码

1.训练数据样本进行增广使用简单的随机左右翻转&#xff0c;预测过程不使用随机图像增广。 使用ToTensor将图像转换为框架所需格式。形状为&#xff08;批量大小&#xff0c;通道数&#xff0c;高度&#xff0c;宽度&#xff09;的32位浮点数&#xff0c;取值范围为0&#xff…

Docker Swarm介绍及使用入门

一、Swarm介绍 Docker Swarm是管理跨节点容器的编排工具&#xff0c;相较于Docker Compose而言&#xff0c;Compose只能编排单节点上的容器&#xff0c;Swarm将一群Docker节点虚拟化为一个主机&#xff0c;使得用户只要在单一主机上操作就能完成对整个容器集群的管理工作。如果…

docker中的c++ ROS节点中使用Matplotlib-cpp

背景 有时debug算法问题&#xff0c;想把算法&#xff0c;代码的中间量快速可视化出来&#xff0c;目前采用rviz或者qt_ros可以实现&#xff0c;但都不是很方便&#xff0c;代码开发量较大&#xff0c;常常会想要是能在ros c中也能像Matlab一样直接plot绘图就好了&#xff0c;…