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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к свойствам дочерних классов с++ из qml  (Прочитано 2340 раз)
finikssky
Гость
« : Август 07, 2015, 01:09 »

Столкнулся c такой проблемой:
Нужно импортировать в Qml классы из С++. Создал базовый класс А (наследует QObject), в нем объявлены свойства А1, А2 ...
Зарегистрировал тип, запустил,в Qml свойства устанавливаются, все в порядке. Теперь создаем класс B, унаследованный от базового А, со свойствами B1,B2.. Сам класс импортируется нормально, но не дает в Qml записать свойства ( B { B1: arg; } ), ругается при запуске, что свойство не найдено (Cannot assign to non-existent property). Из-за чего так получается? ну и как поправить?)

Объявление базового класса
Код:
#include <QObject>

class SpaceObject : public QObject
{
    Q_OBJECT
    
    Q_PROPERTY(int x READ x WRITE setx NOTIFY xChanged)
    Q_PROPERTY(int y READ y WRITE setY NOTIFY yChanged)
    Q_PROPERTY(int radius READ radius WRITE setradius NOTIFY radiusChanged)
    Q_PROPERTY(QString name READ name WRITE setname NOTIFY nameChanged)
    int m_x;
    int m_y;
    int m_radius;  
    QString m_name;

public:
    explicit SpaceObject(QObject *parent = 0);

int x() const
{
    return m_x;
}

int y() const
{
    return m_y;
}

int radius() const
{
    return m_radius;
}

QString name() const
{
    return m_name;
}

signals:

void xChanged(int x);

void yChanged(int y);

void radiusChanged(int radius);

void nameChanged(QString name);

public slots:

void setx(int x)
{
    if (m_x == x)
        return;

    m_x = x;
    emit xChanged(x);
}
void setY(int y)
{
    if (m_y == y)
        return;

    m_y = y;
    emit yChanged(y);
}
void setradius(int radius)
{
    if (m_radius == radius)
        return;

    m_radius = radius;
    emit radiusChanged(radius);
}
void setname(QString name)
{
    if (m_name == name)
        return;

    m_name = name;
    emit nameChanged(name);
}
};

Объявление производного класса:
Код:
[img]#include "spaceobject.h"

class Planet : public SpaceObject
{
    Q_OBJECT
    Q_PROPERTY(int orbit_radius READ orbit_radius WRITE setOrbit_radius NOTIFY orbit_radiusChanged)

public:
    Planet();
    int orbit_radius() const
    {
        return m_orbit_radius;
    }
public slots:
    void setOrbit_radius(int orbit_radius)
    {
        if (m_orbit_radius == orbit_radius)
            return;

        m_orbit_radius = orbit_radius;
        emit orbit_radiusChanged(orbit_radius);
    }
signals:
    void orbit_radiusChanged(int orbit_radius);
private:
    int m_orbit_radius;
};[/img]

Майн:
Код:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>

#include "spaceobject.h"
#include "star.h"
#include "planet.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QUrl sw((QStringLiteral("qrc:/main.qml")));

    qmlRegisterType<SpaceObject>("space", 1, 0, "SpaceObject");
    qmlRegisterType<Star>("space", 1, 0, "Star");
    qmlRegisterType<Planet>("space", 1, 0, "Planet");

    QQmlApplicationEngine engine;
    engine.load(sw);

    return app.exec();
}
Записан
BuRn
Гость
« Ответ #1 : Август 07, 2015, 11:24 »

Цитировать
Известно, что private можно опускать при описании классов, private ставится по умолчанию.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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