Qt 因此,QVariant实例化会静默地注册(先前声明的)元类型
以这个程序为例(改编自一个探索性测试用例,其中我注意到一个定制的元类型看起来像是注册的,尽管没有调用Qt 因此,QVariant实例化会静默地注册(先前声明的)元类型,qt,qvariant,Qt,Qvariant,以这个程序为例(改编自一个探索性测试用例,其中我注意到一个定制的元类型看起来像是注册的,尽管没有调用qRegisterMetaType): (进一步的测试确实表明该元类型是注册的——它可以构造(即使在Q\u DECLARE\u元类型(…)不可见的地方)等等) 这种行为广为人知吗?依靠什么?(可能不会,但按照“官方”规则注册元类型,试图获得一个失败的测试首先让我感到困惑,因此提出了这个问题) 当然,我们可以看到qRegisterMetaType在Q\u DECLARE\u METATYPE(..)
qRegisterMetaType
):
(进一步的测试确实表明该元类型是注册的——它可以构造
(即使在Q\u DECLARE\u元类型(…)
不可见的地方)等等)
这种行为广为人知吗?依靠什么?(可能不会,但按照“官方”规则注册元类型,试图获得一个失败的测试首先让我感到困惑,因此提出了这个问题)
当然,我们可以看到qRegisterMetaType
在Q\u DECLARE\u METATYPE(..)
中调用,但问题仍然存在(至少我希望如此)
提前感谢。
Q\u DECLARE\u METATYPE
不调用qRegisterMetaType
,它定义了一个可以调用的函数。但是QVariant::fromValue
通过调用先前定义的函数间接调用qRegisterMetaType
建议调用qRegisterMetaType
仅用于排队连接之类的事情
这意味着您在为您的类型使用QVariant
模板函数之前不需要调用qRegisterMetaType
(但是在使用这些模板函数的每个编译单元中都必须调用qu DECLARE\u METATYPE
,否则编译将失败)
#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