web-dev-qa-db-ja.com

列挙型をQStringに変換する方法は?

EnumをQStringに変換するためにQtリフレクションを使用しようとしています。

コードの一部は次のとおりです。

class ModelApple
{
    Q_GADGET
    Q_ENUMS(AppleType)
public:
    enum AppleType {
      Big,
      Small
    }
}

そして、ここに私がやろうとしている:

convertEnumToQString(ModelApple::Big)

"Big"を返します

これは可能ですか? convertEnumToQStringについてご存知の場合は、共有してください

27
Jiu

Q_ENUM マクロを使用する必要があります。これは、enum型をメタオブジェクトシステムに登録します。

enum AppleType {
  Big,
  Small
};
Q_ENUM(AppleType)

そして、 QMetaEnum クラスを使用して、列挙子に関するメタデータにアクセスできます。

QMetaEnum metaEnum = QMetaEnum::fromType<ModelApple::AppleType>();
qDebug() << metaEnum.valueToKey(ModelApple::Big);

そのようなユーティリティの一般的なテンプレートを次に示します。

template<typename QEnum>
std::string QtEnumToString (const QEnum value)
{
  return std::string(QMetaEnum::fromType<QEnum>().valueToKey(value));
}
50
Meefte

はるかにエレガントな方法が見つかりました(Qt 5.9)、たった1行で、強力なQVariantの助けを借りました。

列挙型を文字列に変換します。

QString theBig = QVariant::fromValue(ModelApple::Big).toString();

おそらくQMetaEnumはもう必要ありません。

サンプルコードはこちら:

ModelApple(Q_DECLARE_METATYEを要求する必要はありません)

class ModelApple : public QObject
{
    Q_OBJECT
public:
    enum AppleType {
      Big,
      Small
    };
    Q_ENUM(AppleType)
    explicit ModelApple(QObject *parent = nullptr);
};

そして、そこでウィジェットアプリケーションを作成し、そこでQVaraint関数を呼び出します。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <modelapple.h>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QString s = QVariant::fromValue(ModelApple::Big).toString();
    qDebug() << s;

}

MainWindow::~MainWindow()
{
    delete ui;
}

Consoleで文字列を出力しようとしていることがわかりますが、実際には enter image description here

そして、逆キャストをして申し訳ありませんが、私はいくつかのプロジェクトで成功しましたが、今回はコンパイルエラーに遭遇しました。だから私は私の答えからそれを削除することにしました。

15
Ju-Hsien Lai

次の手順を実行してください

QString convertEnumToQString(ModelApple::AppleType type) {
    const QMetaObject metaObject = ModelApple::staticMetaObject;
    int enumIndex = metaObject.indexOfEnumerator("AppleType");
    if(enumIndex == -1) {
        /* The enum does not contain the specified enum */
        return "";
    }
    QMetaEnum en = metaObject.enumerator(enumIndex);
    return QString(en.valueToKey(type));
}
9
The Badger

どうですか:

QString convertEnumToQString(ModelApple::AppleType type)
{
    const QMetaObject &mo = ModelApple::staticMetaObject;
    int index = mo.indexOfEnumerator("AppleType");
    QMetaEnum metaEnum = mo.enumerator(index);
    return metaEnum.valueToKey(type);
}

UPDATED:Qt 5.5については、 this answer を参照してください

2
Danh

私は同じ問題に直面し、これは私がそれを解決した方法です。これは特にQt 4.8

QString string = enumToString(ModelApple::Big);

QString ModelApple::enumToString(AppleType Apple)
{
    int index = metaObject()->indexOfEnumerator("AppleType");
    QMetaEnum metaEnum = metaObject()->enumerator(index);
    return metaEnum.valueToKey(Apple);
}
2
secretgenes

Q_ENUMマクロを使用しない方法を次に示します

#define Enum2QStr(x) (QString(#x).split(“::”).at(1))

利点:列挙型はクラスである必要はありません(Q_OBJECTメンバーまたはQ_ENUMは要求されません)

短所:変数には使用できません

0
Moia