因此,QVariant实例化会默默地注册(先前声明的)元类型

时间:2012-06-04 20:54:53

标签: qt qvariant

采用这个程序(改编自一个探索性的测试用例,我注意到一个自定义元类型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(..),但问题仍然存在(至少我希望如此)。

提前致谢。

1 个答案:

答案 0 :(得分:2)

Q_DECLARE_METATYPE没有调用qRegisterMetaType,它定义了一个函数。但QVariant::fromValue<C1>通过调用先前定义的函数间接调用qRegisterMetaType

documentation表示仅在排队连接等内容时才需要调用qRegisterMetaType

这意味着在为您的类型使用qRegisterMetaType模板函数之前不需要调用QVariant(但必须在每个编译单元中调用Q_DECLARE_METATYPE,其中这些模板函数是使用或编译将失败)。