簡體   English   中英

將Qt屬性枚舉值打印為鍵字符串

[英]Printing a Qt property enum value as a key string

我有一個QML Loader ,在某些情況下我想打印它的status屬性,但是即使使用toString() ,我在控制台上也得到0 因此,我需要始終參考qquickloader_p.h中的枚舉值的順序以了解發生了什么。

還有其他方法嗎?

如果以下語法適合您的需要,實際上有一種方法可以獲取枚舉鍵,而無需知道甚至不傳遞枚舉名稱:

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,盡管對於更隨意的使用,上下文屬性不會帶來太多開銷。

唯一的其他方法是從C ++幫助器訪問該屬性,該幫助器使用moc生成的元數據查找枚舉的名稱。 另請參閱此答案

與使用整數相比,使用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));
}

注冊它,創建一個對象,然后調用該方法。

注意:加載程序的ENUM的名稱為Status myEnumSpy.getEnumName(myLoaderInstance, 'Status', 1) => "Ready"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM