QTextEdit删除给定位置的整行

QTextEdit delete whole line at given position

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

我也在这里找到了解决方案 Remove a line/block from 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次,select特定的行并删除它。

您可以执行以下操作:

QTextEdit te;
// Three lines in the text edit
te.setText("Line 1\nLine 2\nLine 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 上的经历作为对后续问题的警告。

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

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

这里有一个更in-depth的解释:

我想在 UI 和它正在通话的远程单元之间创建消息历史记录。消息将是 color-coded,一条是 UI 发送的消息,另一条是接收的消息。为了防止大量内存影响,我们的想法是将行数限制为特定数量,比如 1000.

我的原始代码与接受的答案非常相似:

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

但是,过了一段时间后,我开始注意到程序的运行时执行速度变慢了。添加调试后,我发现,只要我没有实际查看文本发送到的位置,line-limiter 就不会真正删除这些行。文本被发送到的 QTextEdit 在一个选项卡式小部件中。这意味着我必须循环到该选项卡,否则算法将无法运行。

这是 我的 问题 space:

的有效解决方案
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是一个成员变量QString,作为文本编辑的“模型”,mMaxLine是一个user-configurableint设置允许的最大行数,mEditUIQTextEdit。请注意,光标操作仍然存在,但重要的是用户正在查看元素时。