C++ 频繁向qml传递大量数据时 卡顿 示例代码
时间: 2023-12-08 12:05:19 浏览: 95
下面是一个简单的示例代码,演示如何在 C++ 中使用 ListModel 和 QQmlListProperty,避免频繁向 QML 传递大量数据导致的卡顿问题:
C++ 代码:
```cpp
#include <QObject>
#include <QList>
#include <QQmlListProperty>
#include <QTimer>
#include <QDebug>
class MyData : public QObject
{
Q_OBJECT
Q_PROPERTY(QQmlListProperty<QString> data READ data NOTIFY dataChanged)
public:
MyData(QObject *parent = nullptr) : QObject(parent)
{
// 模拟数据更新,每秒更新一次
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MyData::updateData);
timer->start(1000);
}
QQmlListProperty<QString> data()
{
return QQmlListProperty<QString>(this, &m_data);
}
signals:
void dataChanged();
private:
QList<QString> m_data = {"data1", "data2", "data3"};
void updateData()
{
// 更新数据
m_data.append("new data");
emit dataChanged();
}
};
```
QML 代码:
```qml
import QtQuick 2.0
Item {
property var dataList: myData.data
MyData {
id: myData
}
ListView {
// 使用 ListModel 显示数据
model: ListModel {
id: dataModel
Component.onCompleted: {
for (var i = 0; i < dataList.length; i++) {
dataModel.append({text: dataList[i]})
}
}
}
delegate: Text {
text: model.text
}
}
}
```
在上面的示例代码中,C++ 中的 MyData 类继承自 QObject,通过 Q_PROPERTY 宏将其 data 属性暴露给 QML 使用。data() 方法返回一个 QQmlListProperty<QString> 对象,用于在 C++ 代码中操作 QML ListModel 的属性。MyData 类中还模拟了每秒钟更新一次数据的场景。
在 QML 代码中,使用 ListModel 显示数据,并将 MyData 类中的 data 属性绑定到 ListModel 中。这样,当 MyData 中的数据更新时,QML 中的 ListView 会自动更新 UI 界面,避免了频繁向 QML 传递大量数据导致的卡顿问题。
阅读全文