EnumをQStringに変換するためにQtリフレクションを使用しようとしています。
コードの一部は次のとおりです。
class ModelApple
{
Q_GADGET
Q_ENUMS(AppleType)
public:
enum AppleType {
Big,
Small
}
}
そして、ここに私がやろうとしている:
convertEnumToQString(ModelApple::Big)
"Big"
を返します
これは可能ですか? convertEnumToQString
についてご存知の場合は、共有してください
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));
}
はるかにエレガントな方法が見つかりました(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で文字列を出力しようとしていることがわかりますが、実際には
そして、逆キャストをして申し訳ありませんが、私はいくつかのプロジェクトで成功しましたが、今回はコンパイルエラーに遭遇しました。だから私は私の答えからそれを削除することにしました。
次の手順を実行してください
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));
}
どうですか:
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 を参照してください
私は同じ問題に直面し、これは私がそれを解決した方法です。これは特に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);
}
Q_ENUMマクロを使用しない方法を次に示します
#define Enum2QStr(x) (QString(#x).split(“::”).at(1))
利点:列挙型はクラスである必要はありません(Q_OBJECTメンバーまたはQ_ENUMは要求されません)
短所:変数には使用できません