qmlRegisterType() の引数に変数を使うときの注意点
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 のエディタで見慣れない警告が表示されました。
よく分からないエラーメッセージですね。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 のエディタ的に)正しく扱うことができるようになりました。