【发布时间】: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