Qt - 具有枚举类类型的Q_DECLARE_METATYPE()

时间:2014-08-26 19:51:26

标签: c++ qt enum-class

有没有办法将Q_DECLARE_METATYPE()与枚举类类型一起使用?我知道旧的枚举工作,但这些新的,强类型的?在其他地方无法找到有关此问题的任何内容。我使用的是最新的Qt版本。

示例:

enum Foo
{
    A,
    B,
    C
};

Q_DECLARE_METATYPE(Foo)
QVariant var = Foo::A; // works fine

enum class Bar
{
    X,
    Y,
    Z
};

Q_DECLARE_METATYPE(Bar)
QVariant var = Bar::X; // doesn't compile

3 个答案:

答案 0 :(得分:17)

这是因为当您使用普通的enum

enum Foo { A, B, C };
QVariant var = Foo::A;

编译器实际上使用以下构造函数来构建您的var实例:

QVariant(const QVariant& other);

更进一步,使用以下非显式构造函数创建other实例:

QVariant(int val);

这是可能的,因为旧的enums 可以被视为整数值。

总而言之,这就是编译器在场景后面看到所做的事情

int temp = Foo::A;
QVariant var = QVariant(temp);

如您所知,enum class es CAN NOT 在没有显式强制转换的情况下被视为整数值。因此,编译器不能隐式地将您的类型转换为int,并调用匹配的构造函数(确切地说:来自所有可用构造函数的最佳候选者)。也就是说,有一组预定义的构造函数QVariant。您无法使用Q_DECLARE_METATYPE宏添加新的。

要将QVariant与您自己的类型一起使用,您应该使用QVariant::fromValue(const T& t)函数:

enum class Foo { A, B, C };
QVariant var = QVariant::fromValue(Foo::A);

或者:

enum class Foo { A, B, C };
QVariant var;
var.setValue(Foo::A);

答案 1 :(得分:0)

您可以使用在Qt 5.5中添加的Q_ENUM

enum class Bar
{
    X,
    Y,
    Z
};
Q_ENUM(Bar)

QVariant var = QVariant::fromValue(Bar::X);

答案 2 :(得分:0)

尝试使用QVariant::fromValue提出建议的解决方案,但始终收到类型为

的编译器错误
  

类型未注册,请使用Q_DECLARE_METATYPE宏   使它成为Qt的元对象系统

我的工作流程是将枚举值传递到要求int类型的函数时,将枚举值显式转换为QVariant,在我的情况下,是添加QComboBox项,然后对其进行转换回到我在值检索时的枚举类类型。

在原始问题中,这类似于:

enum class Foo { A, B, C };

// Elsewhere, adding item to QComboBox.
m_comboBox->addItem(tr("A"), static_cast<int>(Foo::A));

// Value retrieval from QComboBox item, somewhere else.
const auto foo { static_cast<Foo>(m_comboBox->currentData().value<int>()) };