c++ - QTextEdit 中的“选择”和“光标”有什么区别?
问题描述
在 QTextEdit 的文档中,我看到定义了两个信号:
void cursorPositionChanged()
void selectionChanged()
前者的文档只说“只要光标位置发生变化,就会发出这个信号。” 后者的文档只说“只要选择发生变化,就会发出这个信号。” 在 QTextEdit 文档的其他地方,听起来这两个概念是相同的;例如,“文本的选择由 QTextCursor 类处理,它提供了创建选择、检索文本内容或删除选择的功能。” 那么这两个信号有什么区别呢??
解决方案
游标是一个迭代器:它是您可以“指向”文档中某些内容的唯一方法。因此,要创建选择,您需要两个光标位置 -anchor()
位置和当前position()
. 这就是为什么游标同时具有它们的原因(它不是最简洁的 API,但可行的选择 API 会复制很多游标的 API)。由于光标用于指向文档,因此选择取决于它们,并且您无法在没有光标的情况下定义选择。为了明确光标是构建选择的基础,您只能将选择创建为光标的属性。
由于游标是一个迭代器,一个文档上可以有多个游标。仅在主cursorPositionChanged()
光标上发出,表示可见的闪烁光标。因此,此信号仅在 上可用QTextEdit
,它维护自己的主光标。文档本身没有那个信号,因为没有单个光标是特殊的。这样你就有了QTextDocument::cursorPositionChanged(const QTextCursor &)
信号。
类似地,一个文档可以有多个选择 - 选择是光标的属性,但只有主光标的选择是可见的,并且selectionChanged()
仅在该主要选择更改时才发出。可以存在其他选择,因为选择只是文档中的一个范围,并且有很多理由使用不必可见的选择。
您可以在没有 的情况下以编程方式对文档进行所有编辑QTextEdit
,因此QTextDocument
甚至没有selectionChanged
信号,因为没有单一的选择可以支持。但是,当光标的选择发生变化时,它会发出光标更改信号。
要理解这些概念,QTextDocument
只需要查看并查看其 API 和 的 API 之间的差异是有帮助QTextEdit
的。
推荐阅读
- asmx - 从 PHP/SOAP 将参数传递给 c# WebMethod
- javascript - 扩展内置数组,super() 行为异常
- rest - fabric-samples:balance-transfer 示例 - v1.1.0 - 缺少说明?
- angular6 - Ngx-tawk 抛出错误未捕获错误:模板解析错误:解析器错误:意外令牌“ID”
- c# - 如何将数据绑定到对象内对象的属性(嵌套对象的属性)
- bash - 用多个关键字检查替换特定行中的单词
- c# - 即时更改图像质量
- mongodb - Mongo查询以查找对象数组中的字段
- r - 我可以使用什么 R 包来计算数组中唯一字符串的出现次数
- node.js - 如何使用 Pugjs 或 Jade 创建表