在 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/