Qt列出了Class的属性

时间:2017-03-15 15:38:11

标签: c++ qt properties macros

我有一个班级(CNode)

CNode有此属性

Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName/* NOTIFY nameChanged*/)

一切都很好......

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

1 个答案:

答案 0 :(得分:2)

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

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

编辑propertyOffset返回CNode属性开始的整数索引(假设超类可能有自己的属性)。如果您希望获得超类的属性,可以使用0开始i。您可以在http://doc.qt.io/qt-5.8/qmetaobject.html#propertyOffset找到更多信息。