Russian Qt Forum
Ноябрь 22, 2024, 23:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Передача вложенных классов в qml  (Прочитано 2818 раз)
AlexJPo
Гость
« : Ноябрь 10, 2016, 14:52 »

Доброго времени суток, с 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<QObject *> Msg1;
Код:
на 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 - тут же выводит данные. В документации есть примеры с массивами строк и классом именно вложенность не смог найти. Подскажите пожалуйста как правильно реализовать такую логику с вложенными классами?
Записан
Отражение луны
Гость
« Ответ #1 : Декабрь 25, 2016, 03:00 »

Вам нужен http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterType
Пока у qmlEngine нету метаданных о классе - к самим данным обратиться не получится.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 21.