-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(表示されていない場所でも) 編集できますQ_DECLARE_METATYPE(..))

この動作はよく知られていますか? 頼った?(おそらくそうではありませんが、メタタイプを登録するための「公式」ルールに従って失敗したテストを取得しようとすると、最初に戸惑いました。したがって、質問です)

PS もちろん、qRegisterMetaType内で呼び出されるのを見ることができます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 に答える