在QTextEdit的文档中,我看到了两个定义的信号:
void cursorPositionChanged()
void selectionChanged()
前者的文档只说“只要光标位置改变,就会发出此信号。”后者的文档仅说“每当选择更改时都会发出此信号”。在QTextEdit文档的其他地方,听起来这两个概念是相同的。例如,“文本的选择由QTextCursor类处理,该类提供了用于创建选择,检索文本内容或删除选择的功能。”那么这两个信号有什么区别?
答案 0 :(得分:2)
游标是一个迭代器:这是“指向”文档中某些内容的唯一方法。因此,要创建选择,您将需要两个光标位置-anchor()
位置和当前position()
。这就是为什么游标同时具有这两个原因的原因(这不是最干净的API,但是可行的选择API会复制很多游标的API)。由于使用了光标来指向文档,因此选择取决于它们,并且没有光标就无法定义选择。为了清楚地表明游标是构建选择的基础,您只能将选择创建为游标的属性。
由于游标是迭代器,因此文档上可以有多个游标。 cursorPositionChanged()
仅在主光标上发出,它表示可见的闪烁光标。因此,该信号仅在QTextEdit
上可用,它保持其自己的主光标。文档本身没有该信号,因为没有单个光标是特殊的。这样就得到了QTextDocument::cursorPositionChanged(const QTextCursor &)
信号。
类似地,文档上可以有多个选择-选择是游标的属性,但是只有主游标的选择可见,并且仅当主选择更改时才发出selectionChanged()
。可以存在其他选择,因为选择只是文档中的一个范围,并且使用选择的原因很多,而这些选择不必是可见的。
您可以以编程方式对文档进行所有编辑,而无需使用QTextEdit
,因此QTextDocument
甚至没有selectionChanged
信号,因为没有一个可供选择的选择。但是,当光标的选择发生更改时,它将发出一个光标更改信号。
要了解这些概念,仅查看QTextDocument
并了解其API和QTextEdit
的API之间的区别是有帮助的。
答案 1 :(得分:1)
我认为解释差异的最好方法是显示一些最小但完整的示例。首先,让我们假设我们有一些textEdit,并将其连接到上述信号:
connect(ui->textEdit, &QTextEdit::selectionChanged, this, []
{
qDebug() << "Selection Changed";
});
connect(ui->textEdit, &QTextEdit::cursorPositionChanged, this, []
{
qDebug() << "Cursor Position Changed";
});
现在可能存在以下用例,这些用例将导致信号被触发,因此输出将基于此而变化:
换句话说,我认为您应该尝试一下此示例,并查看如何检索不同的输出以查看和感觉到差异。最后,这两个信号之间的主要区别是,一个是关于文本光标在QTextEdit元素中的移动,另一个是关于通过键盘更改鼠标交互而选择的文本。另外,这两个信号都可能被触发,因为两个光标的位置都可能发生变化,并且选中的文本也会发生变化。
答案 2 :(得分:1)
QTextCursor有两个与这些信号相关的位置,anchor和position。
selectionChanged
将在锚点或位置发生变化时发出 1 。
cursorPositionChanged
。
QTextCursor
以文本光标在文本编辑器中的行为方式为模型,提供了通过用户界面执行标准动作的编程方式。可以将文档视为单个字符串。然后,光标的当前position()
总是位于字符串中的两个连续字符之间,或者始终位于字符串中的第一个字符之前或最后一个字符之后。
QTextCursor
的位置也为anchor()
。anchor()
和position()
之间的文本是所选内容。如果anchor() == position()
没有选择。