QTextEdit删除给定位置的整行

QTextEdit delete whole line at given position

本文关键字:位置 定位 删除 QTextEdit      更新时间:2023-10-16

我需要从程序中手动从QTextEdit中删除特定行(NoWrap选项处于活动状态)。我找到了一个解释如何删除第一行的解决方案,但我想知道如何删除特定索引处的整行。

我也在这里找到了一个解决方案 从QTextEdit中删除一行/块 ,但我不知道这些块是什么。它们是否代表单行?我应该遍历这些块,如果我在给定索引处到达块,则删除它吗?

您可以使用以下命令删除lineNumer处的行:

QTextCursor cursor = textEdit->textCursor();
cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, lineNumer);
cursor.select(QTextCursor::LineUnderCursor);
cursor.removeSelectedText();
cursor.deleteChar(); // clean up new line
textEdit->setTextCursor(cursor);

在这里,您将光标放在文档的开头,向下移动lineNumer次,选择特定行并将其删除。

您可以执行以下操作:

QTextEdit te;
// Three lines in the text edit
te.setText("Line 1nLine 2nLine 3");
const int lineToDelete = 1; // To delete the second line.
QTextBlock b = te.document()->findBlockByLineNumber(lineToDelete);
if (b.isValid()) {
    QTextCursor cursor(b);
    cursor.select(QTextCursor::BlockUnderCursor);
    cursor.removeSelectedText();
}
我知道

这个问题已经被接受,而且它在这里已经相当死了,但我将把我对QTextEdit的经验作为对后面的人的警告。

我的问题空间与OP相似,因为我想从文本编辑中删除一行。 我遵循这里给出的解决方案,稍微改进一下,最终相信我找到了成功。

然而,这种成功只有在查看文本编辑时才能实现,或者在整个程序过程中至少在屏幕上出现过一次。 虽然我无法确认这一点,但我相信这与光标操作有关。

这里有一个更深入的解释:

我希望在UI和与之交谈的远程设备之间创建消息历史记录。 这些消息将被颜色编码,一个用于UI发送的消息,另一个用于接收的消息。 为了防止巨大的内存影响,这个想法是将行数限制在特定数量,比如1000

我的原始代码很像公认的答案:

  • 如果行数超过我的设定值,请将光标移动到开头并删除第一行。

然而,一段时间后,我开始注意到程序运行时执行速度变慢。 添加调试后,我发现,只要我没有实际查看文本发送到的位置,限行器就永远不会真正删除这些行。 文本发送到的QTextEdit位于选项卡式小部件中。 这意味着我必须循环到该选项卡,否则算法将不起作用。

这是我的问题空间的工作解决方案:

void ScrollingEdit::append(QString text, QColor color)
{
    QString pc = QString("<body style="color:rgb(%1,%2,%3);">").
        arg(color.red()).arg(color.green()).arg(color.blue());
    QString ac = QString("</body>");
    text.prepend( pc );
    text.append( ac );
    mText.append( text );
    QString delim = "</body>";
    if ( mText.count( delim ) > mMaxLine )
    {
        mText.remove(0, mText.indexOf( delim ) + delim.size() );
    }
    mEdit->clear();
    mEdit->setHtml( mText );
    QTextCursor cursor = mEdit->textCursor();
    cursor.movePosition( QTextCursor::End );
    mEdit->setTextCursor(cursor);
    mEdit->ensureCursorVisible();
}

其中mText是充当文本编辑"模型"的成员变量QStringmMaxLine是用户可配置的int,用于设置允许的最大行数,mEditUI QTextEdit。 请注意,光标操作仍然存在,但在重要的地方,即用户查看元素时。