将Qt属性枚举值打印为键字符串

时间:2017-08-23 12:49:22

标签: c++ qt enums qml qtquick2

我有一个QML Loader,在某些情况下,我想要打印其status属性,但我在控制台上获得0,即使我使用{{ 1}}。因此,我需要始终参考qquickloader_p.h中枚举值的顺序,以了解正在发生的事情。

还有其他方式吗?

3 个答案:

答案 0 :(得分:3)

如果以下语法符合您的需要,实际上有一种方法可以在不知道甚至传递枚举名称的情况下获取枚举密钥:

Info.print(loader, "status")

你可以通过这个获得它:

#include <QMetaType>
#include <QMetaProperty>
#include <QMetaEnum>
#include <QObject>
#include <QDebug>

class EnumInfo : public QObject {
    Q_OBJECT
  public slots:
    void print(QObject * obj, QString prop) {
      const QMetaObject * meta = obj->metaObject();
      int i = meta->indexOfProperty(qUtf8Printable(prop));
      if (i > -1) {
        QMetaProperty p = meta->property(i);
        if (p.isEnumType()) {
          QMetaEnum en = p.enumerator();
          qDebug() << en.name() << ":" << en.key(obj->property(p.name()).toInt());
        }
      }
    }
};

该对象最好将QML作为单例暴露,尽管对于更随意的使用,上下文属性不会有太大的开销。

答案 1 :(得分:0)

唯一的另一种方法是从C ++帮助程序访问该属性,该帮助程序使用moc生成的元数据查找枚举的名称。另请参阅this answer

答案 2 :(得分:0)

ENUM用于使代码与使用整数相比更具可读性,但比为此目的使用字符串更快。
他们的意图主要是比较。

如果要为其命名,则需要创建其他结构(例如数组)以查找它们。通常这不是必需的,所以它更有效率,而不是这样做。

如果你看console.log(typeof(Loader.Ready)),你会发现ENUM确实只是一个number - 可能还有一些元对象信息。

由于MetaObject,有一种方法,即使不舒服......事情是,你需要知道ENUM的名称

<强> enumspy.h

#ifndef ENUMSPY_H
#define ENUMSPY_H

#include <QObject>

class EnumSpy: public QObject
{
    Q_OBJECT
public:
    EnumSpy(QObject* parent = nullptr);

public slots:
    QString getEnumName(QObject* object, QString name, int index) const;
};

#endif // ENUMSPY_H

<强> enumspy.cpp

#include <QMetaObject>
#include <QMetaEnum>
#include <QDebug>
#include "enumspy.h"

EnumSpy::EnumSpy(QObject* parent)
    : QObject(parent)
{

}

QString EnumSpy::getEnumName(QObject *object, QString name, int index) const
{
    const QMetaObject* meta = object->metaObject();
    QMetaEnum enm = meta->enumerator(meta->indexOfEnumerator(&name.toStdString()[0]));
    qDebug() << meta;
    return QString(enm.key(index));
}

注册,创建一个对象,并调用该方法。

  

注意: Loader的ENUM名称为Status   myEnumSpy.getEnumName(myLoaderInstance, 'Status', 1) => "Ready"