2 votes

Qt ne peut pas hériter de propriétés

J'ai des problèmes avec les propriétés.

J'ai donc quelques classes (UML)

CNode
   |--CNode2D
         |--CSprite2D

CNode a les propriétés suivantes :

Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName)
Q_PROPERTY(bool visible READ getVisible WRITE setVisible)
Q_PROPERTY(bool enabled READ getEnabled WRITE setEnabled)

CNode2D les a :

Q_OBJECT
Q_PROPERTY(float Position_X READ getPosX WRITE setPosX)
Q_PROPERTY(float Position_Y READ getPosY WRITE setPosY)
Q_PROPERTY(float height READ getHeight WRITE setHeight)

CSprite2D n'en a pas...

Si j'essaie d'imprimer les propriétés dans le constructeur de CSprite2D

for(int i = metaObject()->propertyOffset(); i < metaObject()->propertyCount(); ++i)
{
      qDebug() << metaObject()->property(i).name() << metaObject()->property(i).read(this);
}

Je n'obtiens en sortie que les propriétés de CNode2D

Position_X QVariant(float, 7.47779e+21)
Position_Y QVariant(float, 4.58827e-41)
height QVariant(float, 0)

Ce qui m'amène à penser que CNode2D n'hérite pas des propriétés de CNode ...

Seulement CNode hérite de QObject .

Si je fais hériter les deux autres classes de QObject je reçois des erreurs de compilation.

Je suis nouveau à Qt, donc je pourrais avoir oublié quelque chose d'important, dans ce cas, désolé.

EDIT : Voici les définitions des classes (j'ai supprimé les inclusions) :

    class CNode: public QObject
{
public:
    CNode();
    QString getName();
    void setName(QString nameI);
    bool getVisible ();
    void setVisible (bool i);
    void setEnabled(bool i);
    bool getEnabled();

public slots:
    void nameChanged();
    void visibleChanged();
    void enabledChanged();

public: //properties

    Q_OBJECT
    Q_PROPERTY(QString name READ getName WRITE setName)
    Q_PROPERTY(bool visible READ getVisible WRITE setVisible)
    Q_PROPERTY(bool enabled READ getEnabled WRITE setEnabled)

protected:
    QTreeWidgetItem* nodeListItem;
    QString name;
    bool enabled;
    bool visible; //if the node has to get rendered
};

    class CNode2D: public CNode
{
public:
    CNode2D();
    virtual ~CNode2D();
    void setPosX(float i);
    float getPosX();
    float getPosY();
    void  setPosY(float i);
    float getHeight();
    void  setHeight(float i);

public slots:
    void posXChanged();
    void posYChanged();
    void heightChanged();

public:
    Q_OBJECT
    Q_PROPERTY(float Position_X READ getPosX WRITE setPosX)
    Q_PROPERTY(float Position_Y READ getPosY WRITE setPosY)
    Q_PROPERTY(float height READ getHeight WRITE setHeight)

protected:
    float height;
    float posX;
    float posY;
};

class CSprite2D: public CNode2D
{
public:
    CSprite2D(int number, Ui::MainWindow *i);
    ~CSprite2D();
    int getPosX();
    int getPosY();
    void compile();
private:
    Ui::MainWindow *ui;
    int number_sprite;
    QString spriteLink;
    void drawSprite();
};

3voto

transistor Points 529

Je viens d'essayer un code, par curiosité :

Vous devez ajouter une autre boucle pour accéder également aux propriétés de la superclasse comme ceci :

for(int i = metaObject()->superClass()->propertyOffset(); i < metaObject()->superClass()->propertyCount(); ++i)
{
      qDebug() << metaObject()->superClass()->property(i).name() << metaObject()->superClass()->property(i).read(this);
}

Le simple fait d'appeler metaObject() permet d'accéder uniquement à l'instance dérivée et non aux parents.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X