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

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)

  • `Foo f = var.value <Foo>();`应该做的伎俩 (5认同)
  • 如果我尝试使用“ QVariant :: fromValue()”,则会收到错误消息“类型未注册,请使用Q_DECLARE_METATYPE宏使Qt的元对象系统知道它”。 (2认同)

par*_*y72 5

您可以使用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)

  • 请注意,这仅适用于从 QObject 派生的类内部定义的枚举类,不适用于全局定义的枚举类。 (2认同)
  • 如果您为全局定义的枚举使用命名空间,则可以使用Qt 5.8中添加的“ Q_ENUM_NS” (2认同)