有没有办法在枚举类类型中使用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发布于 2014-08-27 04:32:32
这是因为当您使用普通的老式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 classes 不能被视为整数值。因此,编译器不能隐式地将您的类型转换为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);发布于 2018-10-20 06:52:08
您可以使用Qt 5.5中添加的Q_ENUM:
enum class Bar
{
X,
Y,
Z
};
Q_ENUM(Bar)
QVariant var = QVariant::fromValue(Bar::X);发布于 2019-11-12 21:15:02
尝试了使用QVariant::fromValue提出的解决方案,但不断收到以下类型的编译器错误:
未注册
类型,请使用Q_DECLARE_METATYPE宏将其告知Qt的元对象系统
我的解决方法是,在将枚举值传递给需要QVariant类型的函数时,显式地将枚举值转换为int,在我的示例中,是在添加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>()) };https://stackoverflow.com/questions/25514117
复制相似问题