代码之家  ›  专栏  ›  技术社区  ›  Stefan Monov

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

  •  2
  • Stefan Monov  · 技术社区  · 8 年前

    我有一个QML Loader status 财产,但我 0 toString()

    还有别的办法吗?

    3 回复  |  直到 8 年前
        1
  •  3
  •   Tomilov Anatoliy    8 年前

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

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

        2
  •  0
  •   Kuba hasn't forgotten Monica    8 年前

    唯一的其他方法是从C++助手访问该属性,该助手使用moc生成的元数据查找枚举的名称。另请参见 this answer .

        3
  •  0
  •   derM - not here for BOT dreams    8 年前


    如果你看 console.log(typeof(Loader.Ready)) 你会发现 ENUM number -也许还有一些元对象信息。

    由于元对象,有一种方法,即使不舒服。。。问题是,你需要知道 枚举

    #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。清洁石油产品

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

    注: Status myEnumSpy.getEnumName(myLoaderInstance, 'Status', 1) => "Ready"