Qt4 访问存储在QVariant中的枚举

Qt4 访问存储在QVariant中的枚举,qt4,Qt4,我已在头文件中注册了枚举类型“ClefType”-此枚举使用Q_DECLARE_元类型和Q_ENUMS宏向元对象系统注册。qRegisterMetaType也在类构造函数中调用 这允许我在Q_属性中使用这种类型,这一切都很好。但是,稍后,我需要能够获得此枚举类型的Q_属性,给定对象-以适合序列化的形式 理想情况下,存储该枚举成员的整数值会很有用,因为我不希望它特定于所使用的枚举类型-最终我希望有几个不同的枚举 // This is inside a loop over all the prope

我已在头文件中注册了枚举类型“ClefType”-此枚举使用Q_DECLARE_元类型和Q_ENUMS宏向元对象系统注册。qRegisterMetaType也在类构造函数中调用

这允许我在Q_属性中使用这种类型,这一切都很好。但是,稍后,我需要能够获得此枚举类型的Q_属性,给定对象-以适合序列化的形式

理想情况下,存储该枚举成员的整数值会很有用,因为我不希望它特定于所使用的枚举类型-最终我希望有几个不同的枚举

// This is inside a loop over all the properties on a given object
QMetaProperty property = metaObject->property(propertyId);
QString propertyName = propertyMeta.name();
QVariant variantValue = propertyMeta.read(serializeObject);

// If, internally, this QVariant is of type 'ClefType',
// how do I pull out the integer value for this enum?
不幸的是
variantValue.toInt()不起作用-自定义枚举似乎不能直接“强制转换”为整数值

提前感谢,

亨利

试试:

int x = variantValue.value<ClefType>();
intx=variantValue.value();

您可以使用
我遇到了同样的问题,并提出了以下解决方案,适用于任何枚举类型:

int x = property.enumerator().value(*reinterpret_cast<const int *>(variantValue.constData()));
int x=property.enumerator().value(*reinterpret_cast(variantValue.constData());
您可以使用新的宏(添加在Qt5.5中),而不用担心调用
qRegisterMetaType()
。我编写了一个测试应用程序(使用Google test)来向自己证明它是有效的:

#include <gtest/gtest.h>

#pragma warning(push, 0)
#include <QObject>
#include <QtTest/QSignalSpy>
#pragma warning(pop)

class tColoredObject : public QObject
{
    Q_OBJECT

public:
    enum class eColor
    {
        Red = 1,
        Blue = 2,
        Green = 3
    };
    Q_ENUM(eColor)

    tColoredObject() : m_color(eColor::Red) {}

    void SendSignal(tColoredObject::eColor color) { emit TestSignal(color); }

signals:
    void TestSignal(tColoredObject::eColor color);

private:
    eColor m_color;
};

TEST(Enum, EnumValue)
{
    const QVariant varRed = QVariant::fromValue(tColoredObject::eColor::Red);
    const QVariant varBlue = QVariant::fromValue(tColoredObject::eColor::Blue);
    const QVariant varGreen = QVariant::fromValue(tColoredObject::eColor::Green);

    EXPECT_EQ(varRed.toUInt(), static_cast<uint>(tColoredObject::eColor::Red));
    EXPECT_EQ(varBlue.toUInt(), static_cast<uint>(tColoredObject::eColor::Blue));
    EXPECT_EQ(varGreen.toUInt(), static_cast<uint>(tColoredObject::eColor::Green));

    EXPECT_TRUE(varRed.canConvert<tColoredObject::eColor>());
    EXPECT_TRUE(varBlue.canConvert<tColoredObject::eColor>());
    EXPECT_TRUE(varGreen.canConvert<tColoredObject::eColor>());

    EXPECT_EQ(varRed.value<tColoredObject::eColor>(), tColoredObject::eColor::Red);
    EXPECT_EQ(varBlue.value<tColoredObject::eColor>(), tColoredObject::eColor::Blue);
    EXPECT_EQ(varGreen.value<tColoredObject::eColor>(), tColoredObject::eColor::Green);
}

TEST(Enum, EmitFunctionSucceeds)
{
    tColoredObject objColor;
    QSignalSpy OnTestSignal(&objColor, &tColoredObject::TestSignal);

    objColor.TestSignal(tColoredObject::eColor::Blue);
    EXPECT_EQ(1, OnTestSignal.count());
    QList<QVariant> arguments = OnTestSignal.takeFirst();
    EXPECT_EQ(tColoredObject::eColor::Blue, arguments.at(0).value<tColoredObject::eColor>());
}
#包括
#pragma警告(推送,0)
#包括
#包括
#布拉格警告(pop)
类TColordObject:公共QObject
{
Q_对象
公众:
枚举类生态色
{
红色=1,
蓝色=2,
绿色=3
};
Q_ENUM(生态色)
tcolordObject():m_颜色(eColor::红色){}
void SendSignal(tcolordObject::eColor color){emit TestSignal(color);}
信号:
void TestSignal(tcolordObject::eColor颜色);
私人:
环保色;
};
测试(枚举、枚举值)
{
const QVariant varRed=QVariant::fromValue(tcolordObject::eColor::Red);
const QVariant varBlue=QVariant::fromValue(tcolordObject::eColor::Blue);
常量QVariant varGreen=QVariant::fromValue(tcolordObject::eColor::Green);
EXPECT_EQ(varRed.toUInt(),static_cast(tcolordObject::eColor::Red));
EXPECT_EQ(varBlue.toUInt(),静态_cast(tcolordObject::eColor::Blue));
EXPECT_EQ(varGreen.toUInt(),static_cast(tcolordObject::eColor::Green));
EXPECT_TRUE(varRed.canConvert());
EXPECT_TRUE(varBlue.canConvert());
EXPECT_TRUE(varGreen.canConvert());
EXPECT_EQ(varRed.value(),tcolordObject::eColor::Red);
EXPECT_EQ(varBlue.value(),tcolordObject::eColor::Blue);
EXPECT_EQ(varGreen.value(),tcolordObject::eColor::Green);
}
测试(枚举,emitFunctionSuccessed)
{
t彩色对象对象颜色;
QSignalSpy-OnTestSignal(&objColor,&tcolordObject::TestSignal);
TestSignal(tcolordObject::eColor::Blue);
EXPECT_EQ(1,OnTestSignal.count());
QList arguments=OnTestSignal.takeFirst();
EXPECT_EQ(tcolordObject::eColor::Blue,arguments.at(0).value());
}

虽然这将特别适用于ClefType,但我希望这适用于任何枚举类型。这非常有效-非常感谢您的深入回复!非常感谢
    qRegisterMetaType<CMyClass::ClefType>("ClefType");
    qRegisterMetaTypeStreamOperators<int>("ClefType");
class CMyClass : public QObject
{
    Q_OBJECT
    Q_ENUMS(ClefType)
    Q_PROPERTY(ClefType cleftype READ getCleftype WRITE setCleftype)
public:
    CMyClass(QObject *parent) : QObject(parent), m_cleftype(One)
    {
        qRegisterMetaType<CMyClass::ClefType>("ClefType");
        qRegisterMetaTypeStreamOperators<int>("ClefType");
    }
    enum ClefType { Zero, One, Two, Three };
    void setCleftype(ClefType t) { m_cleftype = t; }
    ClefType getCleftype() const { return m_cleftype; }
private:
    ClefType m_cleftype;
};

Q_DECLARE_METATYPE(CMyClass::ClefType)
int x = property.enumerator().value(*reinterpret_cast<const int *>(variantValue.constData()));
#include <gtest/gtest.h>

#pragma warning(push, 0)
#include <QObject>
#include <QtTest/QSignalSpy>
#pragma warning(pop)

class tColoredObject : public QObject
{
    Q_OBJECT

public:
    enum class eColor
    {
        Red = 1,
        Blue = 2,
        Green = 3
    };
    Q_ENUM(eColor)

    tColoredObject() : m_color(eColor::Red) {}

    void SendSignal(tColoredObject::eColor color) { emit TestSignal(color); }

signals:
    void TestSignal(tColoredObject::eColor color);

private:
    eColor m_color;
};

TEST(Enum, EnumValue)
{
    const QVariant varRed = QVariant::fromValue(tColoredObject::eColor::Red);
    const QVariant varBlue = QVariant::fromValue(tColoredObject::eColor::Blue);
    const QVariant varGreen = QVariant::fromValue(tColoredObject::eColor::Green);

    EXPECT_EQ(varRed.toUInt(), static_cast<uint>(tColoredObject::eColor::Red));
    EXPECT_EQ(varBlue.toUInt(), static_cast<uint>(tColoredObject::eColor::Blue));
    EXPECT_EQ(varGreen.toUInt(), static_cast<uint>(tColoredObject::eColor::Green));

    EXPECT_TRUE(varRed.canConvert<tColoredObject::eColor>());
    EXPECT_TRUE(varBlue.canConvert<tColoredObject::eColor>());
    EXPECT_TRUE(varGreen.canConvert<tColoredObject::eColor>());

    EXPECT_EQ(varRed.value<tColoredObject::eColor>(), tColoredObject::eColor::Red);
    EXPECT_EQ(varBlue.value<tColoredObject::eColor>(), tColoredObject::eColor::Blue);
    EXPECT_EQ(varGreen.value<tColoredObject::eColor>(), tColoredObject::eColor::Green);
}

TEST(Enum, EmitFunctionSucceeds)
{
    tColoredObject objColor;
    QSignalSpy OnTestSignal(&objColor, &tColoredObject::TestSignal);

    objColor.TestSignal(tColoredObject::eColor::Blue);
    EXPECT_EQ(1, OnTestSignal.count());
    QList<QVariant> arguments = OnTestSignal.takeFirst();
    EXPECT_EQ(tColoredObject::eColor::Blue, arguments.at(0).value<tColoredObject::eColor>());
}