使用 QTextCursor 选择一段文本

Selecting a piece of text using QTextCursor

本文关键字:一段 文本 QTextCursor 选择 使用      更新时间:2023-10-16

在使用Qt框架选择文本片段时遇到问题。例如,如果我有这个文档:"没有时间休息"。我想选择"ime for r"并从文档中删除这段文本,我应该如何使用 QTextCursor?这是我的代码:

QTextCursor *cursor = new QTextCursor(ui->plainTextEdit->document());
cursor->setPosition(StartPos,QTextCursor::MoveAnchor);
cursor->setPosition(EndPos,QTextCursor::KeepAnchor);
cursor->select(QTextCursor::LineUnderCursor);
cursor->clearSelection();

不幸的是,它从文本中删除了整行。我尝试使用其他选择类型,如WordUnderCursor或BlockUnderCursor,但没有结果。或者也许有更好的方法可以做到这一点?提前谢谢。

代码中存在几个问题:

  1. cursor->select(QTextCursor::LineUnderCursor);行选择整个当前行。你不想删除整行,那你为什么要写这个?删除此行代码。
  2. clearSelection()只是取消选择所有内容。请改用removeSelectedText()
  3. 不要使用 new 创建QTextCursor。这是正确的,但不是必需的。应尽可能避免使用指针。 QTextCursor通常通过值或引用传递。您也可以使用 QPlainTextEdit::textCursor 获取编辑光标的副本。

因此,代码应如下所示:

QTextCursor cursor = ui->plainTextEdit->textCursor();
cursor.setPosition(StartPos, QTextCursor::MoveAnchor);
cursor.setPosition(EndPos, QTextCursor::KeepAnchor);
cursor.removeSelectedText();

您正在清除选择,而不是基于您的愿望的字符。

请阅读该方法的文档:

void QTextCursor::clearSelection()

通过将锚点设置为光标位置来清除当前所选内容。

请注意,它不会删除所选内容的文本。

您可以看到它只删除了所选内容,而不是文本。请改用以下方法:

void QTextCursor::removeSelectedText()

如果有选定内容,则删除其内容;否则不执行任何操作。

在讨论了这个理论之后,让我们演示一下你可以写什么:

QTextCursor *cursor = new QTextCursor(ui->plainTextEdit->document());
cursor->setPosition(StartPos,QTextCursor::MoveAnchor);
cursor->setPosition(EndPos,QTextCursor::KeepAnchor);
// If any, this should be block selection
cursor->select(QTextCursor::BlockUnderCursor);
cursor->removeSelectedText();
        ^^^^^^^^^^^^^^^^^^