QT QPlainText限制输出指定行,并不断将最旧的一行删去
实现其实非常简单,直接贴代码讲一下
void MainWindow::flushToOutput(int type, const QString &output)
{
Mutex.lock();
ui->plainText->insertPlainText(output + "\n"); // 每条数据分隔开来
QTextDocument *doc = ui->plainText->document();
if (doc->blockCount() > 500) {
QTextCursor cursor(doc);
cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor, 1);
cursor.removeSelectedText();
}
// 移动滚动条到最下面(原有的控件带有32行空,使图标无法移至末尾)
ui->plainText->verticalScrollBar()->setSliderPosition(ui->plainText->verticalScrollBar()->maximum());
Mutex.unlock();
}
下面细讲
QTextCursor cursor(doc);
cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::NextBlock, QTextCursor::KeepAnchor, 1);
cursor.removeSelectedText();
这一段是为了获取plaintext的内容指针,并将指针挪至头部,因为我们限制为500,从头部向下挪一行,删去选中的内容,即删去最久的一行。
最重要的其实是两个锁,在大量数据并行和串行(时间间隔很短)的情况下,锁能够使疯狂增加的数据不把你的程序搞崩。
ui->plainText->verticalScrollBar()->setSliderPosition(ui->plainText->verticalScrollBar()->maximum());
这一段是为了将滚动条挪到最底部,不知道为什么我的程序在输出后出现了一大段空白,我试了很多方法,最后用取巧的方法在后面加了一个-32,总算显示正常了,欢迎评论区指正,搞不明白
ui->plainText->verticalScrollBar()->setSliderPosition(ui->plainText->verticalScrollBar()->maximum()-32);