QTextEdit中的“选择”和“光标”有什么区别?

时间:2019-07-16 18:17:32

标签: c++ qt qtextedit

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

void cursorPositionChanged()
void selectionChanged()

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

3 个答案:

答案 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";
});

现在可能存在以下用例,这些用例将导致信号被触发,因此输出将基于此而变化:

  1. 您可以通过键盘输入一些文本,而无需选择它们。在这种情况下,仅光标位置会改变,因此&QTextEdit :: cursorPositionChanged将被触发,这将导致“光标位置已改变”文本被打印。
  2. 您可以在Windows上使用Ctrl + A组合键来选择所有文本。在这种情况下,&QTextEdit :: selectionChanged将被触发,但&QTextEdit :: cursorPositionChanged将不会被触发。
  3. 在Windows上,您可以单击鼠标左键,然后以不会实际选择文本的方式移动它。在这种情况下,您会多次触发&QTextEdit :: selectionChanged。不知道为什么(也许是Qt问题?)

换句话说,我认为您应该尝试一下此示例,并查看如何检索不同的输出以查看和感觉到差异。最后,这两个信号之间的主要区别是,一个是关于文本光标在QTextEdit元素中的移动,另一个是关于通过键盘更改鼠标交互而选择的文本。另外,这两个信号都可能被触发,因为两个光标的位置都可能发生变化,并且选中的文本也会发生变化。

答案 2 :(得分:1)

QTextCursor有两个与这些信号相关的位置,anchorposition

selectionChanged将在锚点或位置发生变化时发出 1

位置更改时会发出

cursorPositionChanged

  

QTextCursor以文本光标在文本编辑器中的行为方式为模型,提供了通过用户界面执行标准动作的编程方式。可以将文档视为单个字符串。然后,光标的当前position()总是位于字符串中的两个连续字符之间,或者始终位于字符串中的第一个字符之前或最后一个字符之后。

     

QTextCursor的位置也为anchor()anchor()position()之间的文本是所选内容。如果anchor() == position()没有选择。

  1. 除非“无选择项”更改位置,即更改前后它们相等。