我有一个Qt应用程序,我想显示一些日志 . 我用 TextArea
. 但是,如果日志很大或事件过快,GUI就无法足够快地绘制 Textarea
.
我用Qt Creator(QML Profiler)分析了这个问题,如果日志很大,绘制GUI需要300毫秒 . 我在Raspberry Pi2上使用这个软件 .
任何想法如何解决这个问题?我应该使用其他QML控件吗?谢谢 .
QML代码:
TextArea {
text: appHandler.rawCommunication
readOnly: true
}
C代码:
Q_PROPERTY(QString rawCommunication READ rawCommunication WRITE setrawCommunication NOTIFY rawCommunicationChanged)
void setrawCommunication(QString val)
{
val.append("\n");
val.append(m_rawCommunication);
m_rawCommunication = val;
emit rawCommunicationChanged(m_rawCommunication);
}
4 回答
使用view,如ListView . 它们instantiate their delegates as needed,基于视图所说的需要显示的数据,具体取决于用户在列表中的位置 . 这意味着它们在显示大量数据方面的表现要比
TextArea
这样的项目更好,在你的情况下,它会在内存中保留一个巨大的,不断增长的字符串 .你的delegate可能是
TextArea
,所以你需要造型,我建议你选择更轻松的东西,比如TextEdit . 更进一步:如果您不需要可编辑的文本,请使用普通的旧版本Text
. 切换到这些可能没什么区别,但如果你值得一试 .尝试这种方法:创建一个c logger类将所有日志附加到此类并使用某些操作打印它们,例如单击按钮这将解决您的性能问题
代码示例:
Logger.h
Logger.cpp
main.cpp
main.qml
project.pro
使用此approch,当您想释放软件时,可以通过单行更改来停止所有日志
但是,我已经包含了完整的代码,使用“QAbstractListModel”将日志记录重量数据发送到QML
listmodel.h
listmodel.cpp
main.qml
main.cpp
我尝试了
ListView
的建议,但它有几个缺点:添加新输出时,没有简单的方法可以将视图保持在底部
没有跨行/代表的选择
所以我最终使用了缓存的
TextArea
,每秒更新一次: