我有一个班级(CNode)
CNode有此属性
Q_OBJECT
Q_PROPERTY(QString name READ getName WRITE setName/* NOTIFY nameChanged*/)
一切都很好......
Question is
:如何列出所有属性?当然,我可以创建一系列属性名称,但这似乎不太节省空间,因为程序必须在50mb的Ram上运行。
答案 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找到更多信息。