Я нашёл как передавать из qt в qml QAbstractListModel. Но не нашёл как передать QMap. Возможно передавать в qml QMap,QVector и QList? Пример 1 передачи данных из из qt в qml тут и второй вариант тут .
threedobjectmodel.h
#ifndef THREEDOBJECTMODEL_H
#define THREEDOBJECTMODEL_H
class ThreeDModel;
#include <QString>
#include <QAbstractListModel>
#include <QList>
#include <QVariant>
#include <QModelIndex>
class ThreeDObjectModel: public QAbstractListModel
{
Q_OBJECT
public:
ThreeDObjectModel(QObject *parent = nullptr);
enum ThreeDModelRolse {
mapOBVPRole = Qt::DisplayRole,
// mapTextureRole = Qt::UserRole + 1,
// mapStateRole = Qt::UserRole + 2
};
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; // функция доступа к данным
// QMap<int, QVariant> itemData(const QModelIndex &index) const;
QMap<int, QString> setItemOBVP(const QModelIndex &index, const QMap<int, QString> &roles);
bool setItemDataTexture(const QModelIndex &index, const QMap<int,QMap<QString,QString>> &roles);
int rowCount(const QModelIndex &parent) const; // количество элементов в модели
public slots:
void addThreeDModel(ThreeDModel ct);
QHash<int, QByteArray> roleNames() const;
private:
QList<ThreeDModel> ThreeDModels;
QHash<int, QByteArray> roles; // роли
};
class ThreeDModel
{
public:
ThreeDModel(QMap<int,QString> _mapOBVP, QMap<int,QMap<QString,QString>> _mapTexture, QMap<int,QMap<int,QMap<QString,QString>>> _mapState)
{
// name = _name;
// url = _url;
// nameRUS = _nameRUS;
mapOBVP = _mapOBVP;
mapTexture = _mapTexture;
mapState = _mapState;
}
// void setName (QString _name)
// {
// name = _name;
// }
// void setUrl (QString _url)
// {
// url = _url;
// }
// void setNameRUS (QString _nameRUS)
// {
// nameRUS = _nameRUS;
// }
void setMapOBVP (QMap<int,QString> _mapOBVP)
{
mapOBVP = _mapOBVP;
}
void setMapTexture (QMap<int,QMap<QString,QString>> _mapTexture)
{
mapTexture = _mapTexture;
}
void setMapState (QMap<int,QMap<int,QMap<QString,QString>>> _mapState)
{
mapState = _mapState;
}
// QString getName() const
// {
// return name;
// }
// QString getUrl() const
// {
// return url;
// }
// QString getNameRUS() const
// {
// return nameRUS;
// }
QMap<int,QString> getMapOBVP() const
{
return mapOBVP;
}
QMap<int,QMap<QString,QString>> getMapTexture() const
{
return mapTexture;
}
QMap<int,QMap<int,QMap<QString,QString>>> getMapState() const
{
return mapState;
}
private:
QMap<int,QString> mapOBVP;
QMap<int,QMap<QString,QString>> mapTexture;
QMap<int,QMap<int,QMap<QString,QString>>> mapState;
};
#endif // THREEDOBJECTMODEL_H
threedobjectmodel.cpp
#include "threedobjectmodel.h"
ThreeDObjectModel::ThreeDObjectModel(QObject *parent):
QAbstractListModel(parent)
{
roles[mapOBVPRole] = "obvp";
roles[mapTextureRole] = "texture";
roles[mapStateRole] = "state";
}
QHash<int, QByteArray> ThreeDObjectModel::roleNames() const
{
return roles;
}
QMap<int, QString> ThreeDObjectModel::setItemOBVP(const QModelIndex &index, const QMap<int, QString> &roles)
{
if (index.row() < 0 || index.row() > ThreeDModels.count())
{
if (index.row()==1)
{
return QMap<int, QString>();
}
}
const ThreeDModel & ct = ThreeDModels[1];
if (roles == mapOBVPRole)
return ct.getMapOBVP();
return QMap<int, QString>();
}
bool ThreeDObjectModel::setItemDataTexture(const QModelIndex &index, const QMap<int,QMap<QString,QString>> &roles)
{
return true;
}
QVariant ThreeDObjectModel::data(const QModelIndex &index, int role) const
{
if (index.row() < 0 || index.row() > ThreeDModels.count())
{
if (index.row()==0)
{
return QVariant();
}
}
// return QVariant();
const ThreeDModel & ct = ThreeDModels[index.row()];
// if (role == mapOBVPRole)
// return ct.getMapOBVP();
// else if (role == UrlRole)
// return ct.getUrl();
// else if (role == NameRUSRole)
// return ct.getNameRUS();
return QVariant();
}
void ThreeDObjectModel::addThreeDModel(ThreeDModel ct)
{
ThreeDModels << ct;
}
int ThreeDObjectModel::rowCount(const QModelIndex &parent) const
{
return ThreeDModels.size();
}
main.cpp
...
ThreeDObjectModel model;
QMap<int,QString> getMapOBVP;
getMapOBVP.insert("1","test");
model.setItemOBVP(getMapOBVP);
view.engine()->rootContext()->setContextProperty("myModel", &getMapOBVP);
...
QVariantMap
это синоним QMap<QString, QVariant>
(typedef). Таким образом, вам надо ключи перевести в QString, а их значения в QVariant и дальше как обычно.
Qml работает с QVariantMap и с QVariantList как с обычными/классическими JavaScript объектами.
Пример:
class MapDataSender : public QObject
{
Q_OBJECT
signals:
void mapChanged(const QVariantMap& data);
}
//...
main.cpp:
qmlRegisterType<MapDataSender>(...);
*.qml:
Window
{
MapDataSender {
onMapChanged:
{
// Нам доступен аргумент с именем data
// Выводим его свойства и их значения
for (var prop in data) {
console.log(prop, "=", data[prop])
}
}
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Столкнулся с проблемой написания конвертера из Python str в QString с использованием boostpython
Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»
Почему ring в виде восьмигранника оказывается не валиден: