【问题标题】:Qt can't inherit propertiesQt 不能继承属性
【发布时间】:2017-08-10 05:01:20
【问题描述】:

我遇到了属性问题。

所以我有一些类 (UML)

CNode
   |--CNode2D
         |--CSprite2D

CNode 具有以下属性:

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 有这些:

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 没有...

如果我尝试在CSprite2D的构造函数中打印出属性

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

我只输出CNode2D的属性

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

这让我认为CNode2D 没有继承CNode 的属性...

只有CNode 继承自QObject

如果我从QObject 继承其他两个类,我会收到编译错误。

我是 Qt 新手,所以我可能忘记了一些重要的事情,在这种情况下,抱歉。

编辑:这里是类定义(我删除了包含):

    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();
};

【问题讨论】:

  • 你能显示你的类定义吗? CNode 应该继承 QObject,QNode2D 应该继承 QNode,QSprite2D 应该继承 CNode2D。你在使用多重继承吗?文档说:“READ、WRITE 和 RESET 函数可以被继承。它们也可以是虚拟的。当它们在使用多重继承的类中被继承时,它们必须来自第一个继承的类。”那么也许你在你的之前继承了另一个类?
  • @transistor 我编辑了问题
  • 第一次看,我觉得还可以。使用 Qt,如果某些事情没有按预期工作,再次运行 qmake 永远不会有什么坏处。似乎内部结构有时需要刷新。如果我添加/删除了 QObjects,我会定期点击 qmake/rebuild all。此外,您应该将“Q_OBJECT”宏添加到您的类(缺少,在 CSprite2D 中,Destructor 也应该是虚拟的)。

标签: c++ qt inheritance


【解决方案1】:

刚刚尝试了一些代码,我很好奇:

您必须添加另一个循环来访问超类的属性,如下所示:

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

调用 metaObject() 只访问派生实例,而不是父实例。

【讨论】:

  • 谢谢...有没有办法让这更容易?因为它让我很生气,我总是必须添加第二个循环......我不能只添加一个指向属性的指针向量吗?
  • 抱歉,我的产品中没有使用Qt属性系统,所以不太了解。你有什么特殊的用例,你真的需要它?
  • 我正在构建一个游戏引擎...每个节点都有一些属性(名称、位置X、位置Y)等等...
猜你喜欢
  • 2023-04-07
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-12
  • 2023-03-12
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多