首页 > 解决方案 > QTextEdit 中的“选择”和“光标”有什么区别?

问题描述

在 QTextEdit 的文档中,我看到定义了两个信号:

void cursorPositionChanged()
void selectionChanged()

前者的文档只说“只要光标位置发生变化,就会发出这个信号。” 后者的文档只说“只要选择发生变化,就会发出这个信号。” 在 QTextEdit 文档的其他地方,听起来这两个概念是相同的;例如,“文本的选择由 QTextCursor 类处理,它提供了创建选择、检索文本内容或删除选择的功能。” 那么这两个信号有什么区别呢??

标签: c++qtqtextedit

解决方案


游标是一个迭代器:它是您可以“指向”文档中某些内容的唯一方法。因此,要创建选择,您需要两个光标位置 -anchor()位置和当前position(). 这就是为什么游标同时具有它们的原因(它不是最简洁的 API,但可行的选择 API 会复制很多游标的 API)。由于光标用于指向文档,因此选择取决于它们,并且您无法在没有光标的情况下定义选择。为了明确光标是构建选择的基础,您只能将选择创建为光标的属性。

由于游标是一个迭代器,一个文档上可以有多个游标。仅在主cursorPositionChanged()光标上发出,表示可见的闪烁光标。因此,此信号仅在 上可用QTextEdit,它维护自己的主光标。文档本身没有那个信号,因为没有单个光标是特殊的。这样你就有了QTextDocument::cursorPositionChanged(const QTextCursor &)信号。

类似地,一个文档可以有多个选择 - 选择是光标的属性,但只有主光标的选择是可见的,并且selectionChanged()仅在该主要选择更改时才发出。可以存在其他选择,因为选择只是文档中的一个范围,并且有很多理由使用不必可见的选择。

您可以在没有 的情况下以编程方式对文档进行所有编辑QTextEdit,因此QTextDocument甚至没有selectionChanged信号,因为没有单一的选择可以支持。但是,当光标的选择发生变化时,它会发出光标更改信号。

要理解这些概念,QTextDocument只需要查看并查看其 API 和 的 API 之间的差异是有帮助QTextEdit的。


推荐阅读