问题场景
如下,文本框里有一个长度为1800字符的字符串,需要以10hz的刷新率实时动态显示。
但是会造成界面比较卡顿
首要检查事项
看当前的程序编译方式是debug还是release,如果是debug应该改成release,因为release模式下的程序运行流畅度远超debug
尝试方案:
1.使用PlainTextedit
比较有效。
实测,在同样的场景下PlainTextedit比Textedit或者Textbrowser的刷新速度快非常多,原因大概是因为后二者是以富文本格式显示,解析耗时比PlainTextedit的纯文本慢很多。
在上面的场景下PlainTextedit 不会卡到像后二者一样不能动,但是仍然有一点卡顿的感觉
2.封装fastinsert()函数
在网上看到的操作document,但是实测不管是PlainTextedit、Textedit或者Textbrowser使用这个函数,好像速度都没什么变化
void fastAppend(QString message,QTextEdit *editWidget)
{
const bool atBottom = editWidget->verticalScrollBar()->value() == editWidget->verticalScrollBar()->maximum();
QTextDocument* doc = editWidget->document();
QTextCursor cursor(doc);
cursor.movePosition(QTextCursor::End);
cursor.beginEditBlock();
cursor.insertBlock();
cursor.insertHtml(message);
cursor.endEditBlock();
//scroll scrollarea to bottom if it was at bottom when we started
//(we don't want to force scrolling to bottom if user is looking at a
//higher position)
if (atBottom) {
scrollLogToBottom(editWidget);
}
}
void scrollLogToBottom(QTextEdit *editWidget)
{
QScrollBar* bar = editWidget->verticalScrollBar();
bar->setValue(bar->maximum());
}
另一个版本
void fastAppend(QString message,QTextEdit *editWidget)
{
QScrollBar *scrollBar = editWidget->verticalScrollBar();
int barPos = scrollBar->value();
QTextDocument* doc = editWidget->document();
// doc->clear();
doc->setPlainText(message);
// QTextCursor cursor(doc);
// cursor.movePosition(QTextCursor::End);
// cursor.beginEditBlock();
// cursor.insertBlock();
// cursor.insertText(message);
// cursor.endEditBlock();
scrollBar->setValue(barPos);
}
3.Textedit的setPlainText()
没用,速度没有变化
刷新时维持滚动条位置的方法
这时候最好把LineWrapMode 设置为Nowrap,才不会导致一些小问题
void settext_with_scrollbar_keep(QString str,QPlainTextEdit *editWidget){
QScrollBar *scrollBar = editWidget->verticalScrollBar();
int barPos = scrollBar->value();
//修改文本
editWidget->setPlainText(str);
scrollBar->setValue(barPos);
}