首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有枚举类类型的Qt - Q_DECLARE_METATYPE()

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

Stack Overflow用户
提问于 2014-08-27 03:51:26
回答 3查看 13.8K关注 0票数 18

有没有办法在枚举类类型中使用Q_DECLARE_METATYPE()?我知道旧的枚举是有效的,但是这些新的、强类型的枚举呢?在其他地方找不到关于这个问题的任何东西。我使用的是最新的Qt版本。

示例:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-27 04:32:32

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

代码语言:javascript
复制
enum Foo { A, B, C };
QVariant var = Foo::A;

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

代码语言:javascript
复制
QVariant(const QVariant& other);

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

代码语言:javascript
复制
QVariant(int val);

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

总而言之,这就是编译器在幕后看到和做的事情

代码语言:javascript
复制
int temp = Foo::A;
QVariant var = QVariant(temp);

正如您所知道的,如果没有显式强制转换,enum classes 不能被视为整数值。因此,编译器不能隐式地将您的类型转换为int,并调用匹配的构造函数(准确地说,是所有可用构造函数中的最佳候选者)。也就是说,QVariant提供了一组预定义的构造函数。不能使用Q_DECLARE_METATYPE宏添加新的宏。

要在自己的类型中使用QVariant,您应该使用QVariant::fromValue(const T& t)函数:

代码语言:javascript
复制
enum class Foo { A, B, C };
QVariant var = QVariant::fromValue(Foo::A);

或者:

代码语言:javascript
复制
enum class Foo { A, B, C };
QVariant var;
var.setValue(Foo::A);
票数 24
EN

Stack Overflow用户

发布于 2018-10-20 06:52:08

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

代码语言:javascript
复制
enum class Bar
{
    X,
    Y,
    Z
};
Q_ENUM(Bar)

QVariant var = QVariant::fromValue(Bar::X);
票数 8
EN

Stack Overflow用户

发布于 2019-11-12 21:15:02

尝试了使用QVariant::fromValue提出的解决方案,但不断收到以下类型的编译器错误:

未注册

类型,请使用Q_DECLARE_METATYPE宏将其告知Qt的元对象系统

我的解决方法是,在将枚举值传递给需要QVariant类型的函数时,显式地将枚举值转换为int,在我的示例中,是在添加QComboBox项时,然后在值检索时将其转换回我的枚举类类型。

在原问题的上下文中,这类似于:

代码语言:javascript
复制
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>()) };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25514117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档