有没有办法将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
答案 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>()) };