QTextEdit删除给定位置的整行

时间:2015-01-07 08:06:58

标签: c++ qt user-interface text qt5

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

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

3 个答案:

答案 0 :(得分:7)

您可以使用以下内容删除lineNumer处的行

QTextCursor cursor = textEdit->textCursor();

cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::Down, QTextCursor::MoveAnchor, lineNumer);
cursor.select(QTextCursor::LineUnderCursor);
cursor.removeSelectedText();

textEdit->setTextCursor(cursor);

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

答案 1 :(得分:2)

您可以执行以下操作:

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();
}

答案 2 :(得分:1)

我知道这个问题已经被接受,并且在这里已经相当死了,但是我谨在QTextEdit中提出自己的经验,以警告以后的人们。

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

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

这里有更深入的解释:

我希望在UI和与之通信的远程单元之间创建一条消息历史记录。消息将以颜色编码,其中一个用于UI的已发送消息,另一个用于已接收的消息。为了防止大量的内存影响,我们的想法是将行数限制为特定数量,例如1000

我的原始代码很像被接受的答案:

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

但是,一段时间后,我开始注意到程序的运行时执行速度变慢。在加入debug之后,我发现,只要我实际上没有查看文本发送到的位置,行限制器就不会真正擦除行。文本发送到的QTextEdit在选项卡式小部件中。这意味着我必须循环浏览该选项卡,否则该算法将无法正常工作。

这里是 my 问题空间的有效解决方案:

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是用户可配置的int,用于设置最大数量mEditUI QTextEdit。请注意,光标操作仍然存在,但重要的是用户正在查看元素。