c++ - QTextEdit中的 "selection"和 "cursor"有什么区别?

标签 c++ qt 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 与 QTextEdit 的 API 之间的差异。

关于c++ - QTextEdit中的 "selection"和 "cursor"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063268/

相关文章:

c++ - 将 double 转换为 float 时精度损失 1

c++ - 从数组中删除一个元素

c++ - OpenCV GPU 库使用

c++ - QTextEdit 更改单个段落/ block 的字体

c++ - 如何在 Qt 中的 QTextEdit 中显示文本后面或前景的图形对象?

QTextEdit 或 QTextBrowser 性能问题

c++ - AntiVirus 的特征库如何编写?

image - 用于 HDR 图像显示的 Qt 小部件

c++ - 单击按钮显示另一个 ui 文件

c++ - Qt 4.7 : TCP thread, 数据传输导致内存泄漏