首先,参照qt官方自带的实例的,models and view:objectListmodel
下面贴出代码(在官方的实例中稍微修改下,使之符合我的要求),
首先是封装一个Dataobject类,(将所需要的结构体的数据设置为类的属性,使之在QML中可以很好的访问)
DataObject.h
#ifndef DATAOBJECT_H
#define DATAOBJECT_H
#include <QObject>
//![0]
class DataObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
//![0]
public:
DataObject(QObject *parent=0);
DataObject(const QString &name, const QString &color, QObject *parent=0);
QString name() const;
void setName(const QString &name);
QString color() const;
void setColor(const QString &color);
Q_INVOKABLE QList<QObject*> getList();
signals:
void nameChanged();
void colorChanged();
void signalList(QList<QObject*> data);
private:
QString m_name;
QString m_color;
};
#endif // DATAOBJECT_H
DataObject.cpp
#include <QDebug>
#include "dataobject.h"
DataObject::DataObject(QObject *parent)
: QObject(parent)
{
}
DataObject::DataObject(const QString &name, const QString &color, QObject *parent)
: QObject(parent), m_name(name), m_color(color)
{
}
QString DataObject::name() const
{
return m_name;
}
void DataObject::setName(const QString &name)
{
if (name != m_name) {
m_name = name;
emit nameChanged();
}
}
QString DataObject::color() const
{
return m_color;
}
void DataObject::setColor(const QString &color)
{
if (color != m_color) {
m_color = color;
emit colorChanged();
}
}
QList<QObject*> DataObject::getList()
{
QList<QObject*> dataList;
for(int i=0;i<10;i++) //存放需要传送的链表,数目不定
{
QObject* data = new DataObject("xiaodong","red"); //属性输入,可以直接换成所需要的数据变量
dataList.append(data);;
}
emit signalList(dataList); //将数据传入QML中,
return dataList;
}
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QEventLoop>
#include <QQmlEngine>
#include <QtQml>
#include <QTimer>
#include <QQuickView>
#include "appinfo.h"
#include "dataobject.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<DataObject>("DataObject",1,0,"DataObject");
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
view.setSource(QUrl("qrc:view.qml"));
view.show();
return app.exec();
}
view.qml
import QtQuick 2.0
import DataObject 1.0
import QtQuick.Controls 1.2
Rectangle{
width: 200;
height: 900;
//定义获取数据的组件
DataObject{
id:list;
}
Button{
y:850;
onClicked: list.getList();
}
ListView {
id:listview
width: 100; height: 800
spacing: 10 //每个Rectangle相隔10的单位
delegate: Rectangle {
height: 25
width: 100
color: model.modelData.color //设置color为model中的color值--c++传送过来的
Text { text: model.modelData.name }
}
}
Connections{
target: list;
onSignalList:{
listview.model = data; //将c++部分传送过来的list数据设置为listview的model
}
}
}
原创
补充(2018.09.05):
有个新的方法就是通过json数据传输,在C++将数据整理成json格式的string,然后传输给QML,QML在接收到数据后,对json数据进行解析即可,后期单独写一个博客说明