代码之家  ›  专栏  ›  技术社区  ›  Will59

Qt/QML:试图用texteedit创建日志文件视图,结果非常慢

  •  1
  • Will59  · 技术社区  · 6 年前

    我正在开发一款Android应用程序。我需要显示类似控制台的日志类型,它将由C++后端写入。我尝试过将文本编辑和滚动视图结合起来,但效果非常慢。当我的日志超过50行时,添加几行会使界面慢下来(锁定)几秒钟。

    精简源代码,这是日志视图部分:

    property int logMaxLines: 50
    
    ScrollView {
        id: logScrollView
        anchors.fill: parent
        clip: true
        ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
        TextEdit {
            id: logTextEdit
            anchors.fill: parent
            readOnly: true
            color: "darkgreen"
            property int linesTrimmed: 0
        }
    }
    
    Connections{
        target: gate
        onNewMessageLineAdded :
        {
            logTextEdit.append(gate.newMessageLine)
            if (logTextEdit.lineCount > logMaxLines) {
                while (logTextEdit.lineCount >= logMaxLines) {
                    logTextEdit.text = logTextEdit.text.slice(logTextEdit.text.indexOf('\n')+2)
                    logTextEdit.linesTrimmed++
                }
                logTextEdit.insert(0, "[... trimmed " + logTextEdit.linesTrimmed + " lines ...]\n")
            }
        }
    }
    

    我选择了一个滚动视图,因为我想要垂直滚动条。当C++代码发出newMessageLineAdded信号时,它会一次添加一行。这来自一个包含此Q\U属性的类,用于传递新行内容:

    Q_PROPERTY(QString newMessageLine READ newMessageLine NOTIFY newMessageLineAdded)
    

    信号声明为:

    void newMessageLineAdded();
    

    我添加了一小段java,以便在日志增长过长时对其进行修剪,因为即使没有这种修剪代码,问题仍然存在。

    我在这里做什么很笨拙的事吗?我是否应该使用另一种类型的对象来替换TextEdit,因为我知道它根本不用于编辑文本,而只是作为一种显示? 谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   ephemerr    6 年前

    我建议您使用 ListView 而不是 TextEdit . 和使用 QStringListModel 作为模型在C++代码中声明,并作为上下文属性添加到QML中。阅读 Embedding C++ Objects into QML with Context Properties . 为了获得更好的性能,建议在C++代码中使用大部分逻辑。