c++ - 将 Exposed 模型集成到 ListModel QML
问题描述
我已经使用 main.qml 中的 ListView 成功地公开了一个包含从 C++ 到我的 main.qml 的 3 个整数的列表
ListView {
width: 200; height: 250
required model
delegate: Text {
required property int longitude
required property int latitude
required property int height_
text: "Data: " + longitude + ", " + latitude +","+ height_
}}
我真正需要做的是将我的 C++ 模型集成到ItemModelSurfaceDataProxy中,它采用这样的 ListModel
ListModel {
id: myModel
ListElement{ longitude: "0"; latitude: "0"; height_: "124"; }
}}
main.qml 使用qtdatavisualization-qmlsurface-example ,, example_source_code
Rectangle {
id: mainview
width: 1024
height: 768
color: surfacePlot.theme.windowColor
Item {
id: surfaceView
width: mainview.width
height: mainview.height
anchors.top: mainview.top
anchors.left: mainview.left
Surface3D {
id: surfacePlot
width: surfaceView.width
height: surfaceView.height
Surface3DSeries {
id: surfaceSeries
flatShadingEnabled: false
drawMode: Surface3DSeries.DrawSurface
ItemModelSurfaceDataProxy {
itemModel: myModel **// this needs to be replaced by C++ model**
rowRole: "longitude"
columnRole: "latitude"
yPosRole: "height_"
}
onDrawModeChanged: checkState()
}
}
ListModel { **//This is the model that needs to be replaced by C++ Model**
id: myModel
}
}}
主文件
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
AnimalModel model;
model.addAnimal(Animal(1, 2,3));
model.addAnimal(Animal(2,4,5));
model.addAnimal(Animal(3,4,6));
QQuickView viewer;
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
viewer.setInitialProperties({{"model", QVariant::fromValue(&model)}});
viewer.setSource(QUrl("qrc:/qml/qml/qmlsurface/main.qml"));
viewer.setTitle(QStringLiteral("Egyptolict "));
viewer.show();
return app.exec();
}
使用 QT示例的 model.cpp
#include "model.h"
Animal::Animal(const int &longitude, const int &latitude,const int &height_)
: m_longitude(longitude), m_latitude(latitude) ,m_height(height_){}
int Animal::longitude() const{
return m_longitude;}
int Animal::latitude() const{
return m_latitude;}
int Animal::height_() const{
return m_height;}
AnimalModel::AnimalModel(QObject *parent)
: QAbstractListModel(parent)
{
}
void AnimalModel::addAnimal(const Animal &animal)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_animals << animal;
endInsertRows();
}
int AnimalModel::rowCount(const QModelIndex & parent) const {
Q_UNUSED(parent);
return m_animals.count();
}
QVariant AnimalModel::data(const QModelIndex & index, int role) const {
if (index.row() < 0 || index.row() >= m_animals.count())
return QVariant();
const Animal &animal = m_animals[index.row()];
if (role == longitudeRole)
return animal.longitude();
else if (role == latitudeRole)
return animal.latitude();
else if (role == heightRole)
return animal.height_();
return QVariant();
}
QHash<int, QByteArray> AnimalModel::roleNames() const {
QHash<int, QByteArray> roles;
roles[longitudeRole] = "longitude";
roles[latitudeRole] = "latitude";
roles[heightRole] = "height_";
return roles;
}
model.h 使用 qt示例
#include <QAbstractListModel>
#include <QStringList>
class Animal
{public:
Animal(const int &longitude, const int &latitude , const int &height_);
int longitude() const;
int latitude() const;
int height_() const;
private:
int m_longitude;
int m_latitude;
int m_height;
};
class AnimalModel : public QAbstractListModel
{
Q_OBJECT
public:
enum AnimalRoles {
longitudeRole = Qt::UserRole + 1,
latitudeRole,
heightRole
};
AnimalModel(QObject *parent = 0);
void addAnimal(const Animal &animal);
int rowCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
QHash<int, QByteArray> roleNames() const;
private:
QList<Animal> m_animals;
};
解决方案
您应该在以下位置设置属性rootContext
:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
AnimalModel model;
model.addAnimal(Animal(1, 2,3));
model.addAnimal(Animal(2,4,5));
model.addAnimal(Animal(3,4,6));
QQuickView viewer;
viewer.setResizeMode(QQuickView::SizeRootObjectToView);
viewer.rootContext()->setContextProperty("model", &model);
viewer.setSource(QUrl("qrc:/qml/qml/qmlsurface/main.qml"));
viewer.setTitle(QStringLiteral("Egyptolict "));
viewer.show();
return app.exec();
}
该setInitialProperties
函数尝试设置对象的属性(在本例中为“main.qml”文件),如果您将其添加property var model
到“main.qml”,它可能会起作用。
PS,如果您不想混淆属性“高度”,则可以使用“高度”;-)
推荐阅读
- python - 如何使用值元组格式化字符串,例如使用 %(name)s
- swift - 如何制作更改屏幕视图的条件按钮?
- c# - 如何将大聚合根拆分为更小?
- google-chrome - 使用自动热键获取 Chrome 中打开的标签页数
- javascript - bodyParser 被删除不能在 express 中 POST 错误
- groovy - 无法使用 groovy/spock 从端到端启动 Spring 批处理作业 - 集成测试
- vue.js - Vue.js 过滤函数返回 [Object Promise]
- hadoop - 我需要从 PIG HADOOP 的同一列中过滤 2 个条件
- java - @OneToMany 插入后返回 null
- r - 根据 IF 语句 R 生成新的观察值