-1

拿这个程序(改编自一个探索性测试用例,我注意到一个自定义元类型就像它被注册一样,虽然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'ed (即使在Q_DECLARE_METATYPE(..)不可见的地方)等)

这种行为众所周知吗?依靠?(可能不是,但是尝试按照“官方”规则注册元类型首先让我感到困惑,因此提出了这个问题)

PS 当然,可以看到qRegisterMetaType调用 inside Q_DECLARE_METATYPE(..),但问题仍然存在(至少我希望如此)。

提前致谢。

4

1 回答 1

2

Q_DECLARE_METATYPE doesn't call qRegisterMetaType, it defines a function that does. But QVariant::fromValue<C1> calls qRegisterMetaType indirectly, by calling the previously defined function.

The documentation suggests that calling qRegisterMetaType is only needed for things like queued connections.

Which means that you don't need to call qRegisterMetaType before using QVariant template functions for your type (but Q_DECLARE_METATYPE has to be called in each compilation unit where those template functions are used or the compilation will fail).

于 2012-06-05T01:02:41.653 回答