采用这个程序(改编自一个探索性的测试用例,我注意到一个自定义元类型bahaves就像它已注册,虽然qRegisterMetaType
没有被调用):
#include <QMetaType>
#include <QVariant>
#include <iostream>
class C1 {
};
Q_DECLARE_METATYPE(C1)
int main() {
std::cout << QMetaType::type("C1") << std::endl;
QVariant v = QVariant::fromValue<C1>(C1());
std::cout << QMetaType::type("C1") << std::endl;
return 0;
}
输出:
0
256
(并且进一步的测试确实显示了元数据类型确实已注册 - 它可以construct
编辑(即使在Q_DECLARE_METATYPE(..)
不可见的地方),等等。
这种行为是否众所周知?依靠? (可能不是,但试图按照“官方”规则进行失败的测试,首先注册一个元型,让我感到困惑,因此问题)
P.S。当然,人们可以在qRegisterMetaType
内看到Q_DECLARE_METATYPE(..)
,但问题仍然存在(至少我希望如此)。
提前致谢。
答案 0 :(得分:2)
Q_DECLARE_METATYPE
没有调用qRegisterMetaType
,它定义了一个函数。但QVariant::fromValue<C1>
通过调用先前定义的函数间接调用qRegisterMetaType
。
documentation表示仅在排队连接等内容时才需要调用qRegisterMetaType
。
这意味着在为您的类型使用qRegisterMetaType
模板函数之前不需要调用QVariant
(但必须在每个编译单元中调用Q_DECLARE_METATYPE
,其中这些模板函数是使用或编译将失败)。