QTextEdit 设置上限行数,超过上限行数自动删除行

363 阅读1分钟

1、背景

最近使用QTextEdit 作为程序运行时的信息输出区,来进行用户的交互,由于设置为不可编辑,在程序长时间运行后,该QTextEdit控件所占内存巨大导致程序奔溃,所以设置上限很好的增加了程序的稳定性!

2、实现方法

使用QTextCursor类 模拟光标操作来删除多余的部分,代码如下,具体解释看注释

void MainWindow::textEditAppend(QString text)
{
    {//添加日志
        QTextCursor cursor = ui->textEdit->textCursor();
        cursor.movePosition(QTextCursor::End);
        ui->textEdit->setTextCursor(cursor);
        ui->textEdit->append(QDateTime::currentDateTime().toString("yyyy/MM/dd hh:mm:ss >> ") + text);
        qDebug() << text;
    }

    QTextDocument *document = ui->textEdit->document(); // 获取文档对象,想象成打开了一个TXT文件
    int rowCount = document->blockCount(); // 获取输出区的行数
    int maxRowNumber = 5000;//设定最大行
    if(rowCount > maxRowNumber){//超过最大行则开始删除
        QTextCursor cursor = QTextCursor(document); // 创建光标对象
        cursor.movePosition(QTextCursor::Start); //移动到开头,就是TXT文件开头

        for (int var = 0; var < rowCount - maxRowNumber; ++var) {
            cursor.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor); // 向下移动并选中当前行
        }
        cursor.removeSelectedText();//删除选择的文本
    }
}

3、注意事项

一、最大值的设置看你自己的实际测试,我这里是2000;

二、选择文本的方式!这里用的cursor.movePosition(QTextCursor::Down, QTextCursor::KeepAnchor),要是使用cursor.select(QTextCursor::LineUnderCursor) 行选择,或者cursor.select(QTextCursor::BlockUnderCursor) 段选择,只能删除第一行,因为他俩都无法选择换行符,所以第一行始终都是空白的!