C++ Qt列出类的属性

C++ Qt列出类的属性,c++,qt,properties,macros,C++,Qt,Properties,Macros,我有一门课(CNode) CNode拥有这个属性 Q_OBJECT Q_PROPERTY(QString name READ getName WRITE setName/* NOTIFY nameChanged*/) 一切都很好 问题是:如何列出所有属性?当然,我可以创建一个属性名数组,但这似乎不太节省空间,因为程序必须在50mb的Ram上运行。您需要使用类的实例,该实例包含有关属性、信号、插槽和其他元数据的信息。 假设我们有 class CNode: public QObject {

我有一门课(CNode)

CNode拥有这个属性

Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName/* NOTIFY nameChanged*/)
一切都很好

问题是
:如何列出所有属性?当然,我可以创建一个属性名数组,但这似乎不太节省空间,因为程序必须在50mb的Ram上运行。

您需要使用类的实例,该实例包含有关属性、信号、插槽和其他元数据的信息。 假设我们有

class CNode: public QObject
{
      Q_OBJECT

      Q_PROPERTY(int myInt_ READ myInt WRITE setMyInt)
      Q_PROPERTY(QString myStr_ READ myStr WRITE setMyStr)

public:
      int myInt() const {return myInt_;}
      QString myStr() const {return myStr_;}
      void setMyInt(int value) {myInt_ = value;}
      void setMyStr(const QString& value) {myStr_ = value;}

private:
      int myInt_;
      QString myStr_;
};
现在我们可以得到所有具有名称和值的属性:

CNode* node = new CNode;
node->setMyInt(100);
node->setMyStr("Its my string");
for(int i = node->metaObject()->propertyOffset(); i < node->metaObject()->propertyCount(); ++i)
{
      qDebug() << node->metaObject()->property(i).name() << node->metaObject()->property(i).read(node);
}
CNode*节点=新的CNode;
节点->设置myint(100);
node->setMyStr(“它是我的字符串”);
对于(int i=node->metaObject()->propertyOffset();imetaObject()->propertyCount();+i)
{
qDebug()元对象()->属性(i).name()元对象()->属性(i).read(节点);
}

Edit
propertyOffset
返回CNode属性开始的整数索引(假设超类可能有自己的属性)。如果您也希望获得超类的属性,可以从0开始
i
。您可以在中找到更多信息。

您可以使用QMetaObject功能来完成。看一看,谢谢;)@EM2请你制定一个答案,并给出一些例子,以便下一个人不需要太多的浏览就能轻松找到它@em2ery您仍然需要为模型创建一个列表,区别在于它将自动执行,而不是手动键入。propertyOffset()返回什么?我在docI put`metaObject()->property(metaObject()->propertyCount()-1).name()中找不到它;进入节点的构造函数,但我得到了一个编译器-error@ThefrenchSpeedruns请提供完整的例子。也许提出新的问题更合适
CNode::CNode(){qDebug()属性(metaObject()->propertyCount()-1).name();}
对我有用,我只是忘了包括QMetaProperty和QMetaObject