Ven*_*nom 15 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
Run Code Online (Sandbox Code Playgroud)
Pio*_*cki 21
这是因为当你使用普通旧时enum:
enum Foo { A, B, C };
QVariant var = Foo::A;
Run Code Online (Sandbox Code Playgroud)
事实上,编译器使用以下构造函数来构建您的var实例:
QVariant(const QVariant& other);
Run Code Online (Sandbox Code Playgroud)
更进一步,other使用以下非显式构造函数创建实例:
QVariant(int val);
Run Code Online (Sandbox Code Playgroud)
这是可能的,因为旧的enums 可以被视为整数值.
总而言之,这就是编译器在场景后面看到和做的事情:
int temp = Foo::A;
QVariant var = QVariant(temp);
Run Code Online (Sandbox Code Playgroud)
如你所知,enum classES 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);
Run Code Online (Sandbox Code Playgroud)
或者:
enum class Foo { A, B, C };
QVariant var;
var.setValue(Foo::A);
Run Code Online (Sandbox Code Playgroud)
您可以使用Qt 5.5中添加的Q_ENUM:
enum class Bar
{
X,
Y,
Z
};
Q_ENUM(Bar)
QVariant var = QVariant::fromValue(Bar::X);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9200 次 |
| 最近记录: |