Qt 5 の未来は明るいブログ

qmlRegisterType() の引数に変数を使うときの注意点

Published: 2013-01-13 / Last modified: 2016-09-26

int qmlRegisterType(const char * uri, int versionMajor, int versionMinor, const char * qmlName) は C++ の QObject の派生クラスを QML のエレメントとして登録するおまじないで通常は以下のように使います。

qmlRegisterType<Object>("My.Module", 1, 0, "Object");

同じクラスを複数のモジュールやバージョンで使えるように以下のような関数を作成し、

void silkRegisterObject(const char *uri, int major, int minor)
{
    qmlRegisterType<XmlTag>(uri, major, minor, "Tag");
    qmlRegisterType<XmlComment>(uri, major, minor, "Comment");
}
silkRegisterObject("My.Module", 1, 0);
silkRegisterObject("My.Module", 2, 0);

のように使用するように変更したところ、Qt Creator のエディタで見慣れない警告が表示されました。

The module URI cannot be determined by static analysis. The type will be available
globally in the QML editor. You can add a "// @uri My.Module.Uri" annotation to let Qt Creator know about a likely URI.

よく分からないエラーメッセージですね。Qt Creator の QML のエディタでは、モジュールやエレメント、プロパティなどを正しく扱う(補完やジャンプなどの)ために C++ のコードを解析しているのですが、上記のように uri が変数になってる場合にはモジュール名が決定できないので // @uri モジュール名 というコメントを書いてください。ということです。

void silkRegisterObject(const char *uri, int major, int minor) {
    // @uri Silk.XML
    qmlRegisterType<XmlTag>(uri, major, minor, "Tag");
    qmlRegisterType<XmlComment>(uri, major, minor, "Comment");
}

とすると Silk.XML モジュールを import した際に Tag や Comment 要素を(QML のエディタ的に)正しく扱うことができるようになりました。