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