Доброго времени суток, с qt столько начинаю разбираться и мне необходимо решить следующую задачу.
Есть класс с вложенными классами:
#ifndef VDBDATA_H
#define VDBDATA_H
#include <QObject>
#include <QVector>
#include "vdbmsg1.h"
#include "vdbmsg11.h"
#include "vdbmsg2.h"
#include "vdbmsg4.h"
class VdbData : public QObject {
Q_OBJECT
Q_PROPERTY(QList<QObject *> vdbMsg1 READ getvdbMsg1 WRITE setVdbMsg1 NOTIFY vdbMsg1Changed)
public:
QList<QObject *> Msg1;
QList<VdbMsg11 *> Msg11;
VdbMsg2 *Msg2;
QList<VdbMsg4 *> Fas;
QList<QObject *> getvdbMsg1() { return Msg1; }
signals:
void vdbMsg1Changed();
public slots:
void setVdbMsg1(QList<QObject *> value)
{
Msg1 = value;
emit vdbMsg1Changed();
}
};
#endif // VDBDATA_H
Пример класса: Msg1
#ifndef VDBMSG1_H
#define VDBMSG1_H
#include <QObject>
class VdbMsg1 : public QObject
{
Q_OBJECT
Q_PROPERTY(int msg1SatNum READ GetSatNum WRITE SetSatNum NOTIFY UpdateSatNum )
Q_PROPERTY(double msg1Prc READ GetPrc WRITE SetPrc NOTIFY UpdatePrc )
Q_PROPERTY(double msg1SigmaPrGnd READ GetSigmaPrGnd WRITE SetSigmaPrGnd NOTIFY UpdateSigmaPrGnd )
public:
VdbMsg1();
int SatNum;
double Prc;
double SigmaPrGnd;
int GetSatNum();
double GetPrc();
double GetSigmaPrGnd();
signals:
void UpdateSatNum();
void UpdatePrc();
void UpdateSigmaPrGnd();
public slots:
void SetSatNum(int value);
void SetPrc(double value);
void SetSigmaPrGnd(double value);
};
//Q_DECLARE_METATYPE(VdbMsg1 *)
#endif // VDBMSG1_H
main.cpp:
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDebug>
#include "vdbdata.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
VdbData *vdbdata = new VdbData();
QList<QObject *> vdbList;
for (int i = 0; i < 15; i++) {
VdbMsg1 *vdbmsg1 = new VdbMsg1();
vdbmsg1->SetSatNum(i + 1);
vdbmsg1->SetPrc(i + 4.3);
vdbmsg1->SetSigmaPrGnd(i * 0.5);
//vdbdata->Msg1.append(vdbmsg1);
vdbList.append(vdbmsg1);
}
//vdbdata->Msg1.at(3);
//vdbList.at(3)->SetPrc(1233445.1123);
vdbdata->setVdbMsg1(vdbList);
VdbMsg1 *test = qobject_cast<VdbMsg1*>(vdbdata->Msg1.at(1));
test->SetPrc(123.768);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("VdbData", QVariant::fromValue(vdbdata));
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
вывожу все в:
TableView {
id: table
Layout.fillWidth: true
Layout.fillHeight: true
property int tableW: (parent.width-20) / 3;
TableViewColumn {
role: 'msg1SatNum'
title: 'Номер спутника (SatNum)'
width: table.tableW
}
TableViewColumn {
role: 'msg1Prc'
title: 'Псевдодальность (в метрах) (Prc)'
width: table.tableW
}
TableViewColumn {
role: 'msg1SigmaPrGnd'
title: 'CKO псевдодальности (SigmaPrGnd)'
width: table.tableW
}
model: VdbData.vdbMsg1
}
В таком варианте работает. Меня смущает не костылем ли сделано и вот почему:
Если в классе VdbData поменять тип:
на QList<VdbMsg1 *> Msg1;
И в main.cpp:
int main(int argc, char *argv[])
{
QList<VdbMsg1 *> vdbList;
for (int i = 0; i < 15; i++) {
VdbMsg1 *vdbmsg1 = new VdbMsg1();
vdbmsg1->SetSatNum(i + 1);
vdbmsg1->SetPrc(i + 4.3);
vdbmsg1->SetSigmaPrGnd(i * 0.5);
//vdbdata->Msg1.append(vdbmsg1);
vdbList.append(vdbmsg1);
}
vdbdata->setVdbMsg1(vdbList);
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("VdbData", QVariant::fromValue(vdbdata));
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
Ошибок не выдает, но не выводит данные. Как только в QList использую QObject - тут же выводит данные. В документации есть примеры с массивами строк и классом именно вложенность не смог найти. Подскажите пожалуйста как правильно реализовать такую логику с вложенными классами?