欠落しているタイプ
この警告カテゴリのスペルは[missing-type]
です。
エイリアスの型を推測できません
何が起こったのでしょうか?
エイリアス・プロパティが C++ 型のプロパティを指していて、そのプロパティに対応する QML 型が見つかりませんでした。これはQMLモジュールをインポートする際に、他のモジュールとのQML依存関係を宣言していない場合に起こります。
注意: QMLモジュールをインポートする場合、そのモジュールが実際にインストールされ、インポートパスにそのモジュールが含まれていることを確認してください。
この警告は、エイリアスが参照するプロパティの型にQMLの対応するものがないことを示しているのかもしれません。例えば、参照されているプロパティの型にQML_ELEMENT マクロがない可能性があります。このような場合は「C++からQMLの型を定義する」または「概要 - QMLとC++の統合」を参照してください。
なぜこのようなことが起こるのでしょうか?
コンパイラはこのプロパティエイリアスをC++にコンパイルすることができず、qmllintや QML Language Serverはこのプロパティエイリアスを解析することができません。
例
QMLモジュールにプロパティmyProperty
:
#include <QQuickItem> #include <QtQml/qqmlregistration.h> #include <QObject> class MyCppObject : public QObject { Q_OBJECT QML_ELEMENT public: MyCppObject(QObject *parent = nullptr) : QObject(parent) {} Q_PROPERTY(QQuickItem *myProperty READ myProperty WRITE setMyProperty NOTIFY notifyMyProperty) QQuickItem *myProperty() { return m_myProperty; } void setMyProperty(QQuickItem *item) { emit notifyMyProperty(); m_myProperty = item; } private: QQuickItem *m_myProperty; signals: void notifyMyProperty(); };
というプロパティCMakeLists.txt
があるとします:
project(mymodule VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.5 REQUIRED COMPONENTS Quick) qt_standard_project_setup(REQUIRES 6.5) qt_add_executable(appmymodule main.cpp ) qt_add_qml_module(appmymodule URI mymodule VERSION 1.0 QML_FILES Main.qml HelloWorld.qml SOURCES mycppobject.cpp mycppobject.h ) target_link_libraries(appmymodule PRIVATE Qt6::Quick )
このクラスがコンパイル可能で、QQuickItem インクルードが見つかるように、C++ 依存関係Quick
が宣言されています。また、mymodule
はQtQuick に依存していません。
では、QMLのエイリアスでmyProperty
を使ってみましょう。プログラムは実行されますが、コンパイラなどのQMLツールはmyProperty
の使用について警告を発します:
import mymodule MyCppObject { id: root property alias myAlias: root.myProperty // not ok: Cannot deduce type of alias [missing-type] }
警告メッセージが表示される理由は、QMLファイル内にimport QtQuick
があっても、QMLコード上では、myProperty
の型QQuickItem
と、そのQMLの対応するItem
がわからないからです。これは、同じ型が異なるモジュールの異なる属性で複数回公開される可能性があるためです。mymodule
は実際には、myProperty
のQML型について正確でなければなりません。
この警告を修正するには、CMakeLists.txt
に依存関係を追加してください:
qt_add_qml_module(mymodule URI mymodule ... # declarare QML dependency to QtQuick module DEPENDENCIES QtQuick ... )
これで警告は消えるはずです!
モジュールの依存関係の宣言も参照してください。
プロパティに型が見つかりません
何が起こったのでしょうか?
QMLの型が見つからないプロパティにバインディングが設定されました。これは、QMLモジュールが他のモジュールとのQML依存関係を宣言していないために起こる可能性があります。
注意: もし、外部依存の QML モジュールをインポートするのであれば、そのモジュールが 実際にインストールされているか、また、そのモジュールがインポートパスに含まれているか を確認してください。
この警告は、プロパティの型にQMLの対応するものがないことを示しているのかもしれません。例えば、プロパティの型にQML_ELEMENT マクロがない可能性があります。このような場合は「C++からQMLの型を定義する」または「概要 - QMLとC++の統合」を参照してください。
なぜこのようなことが起こるのでしょうか?
コンパイラがこのプロパティバインディングをC++にコンパイルできず、qmllintや QML Language Serverがこのプロパティバインディングを解析できないからです。
例
QMLモジュールに、myProperty
とmyProperty2
の2つのプロパティを持つC++クラスがあるとします:
#include <QQuickItem> #include <QtQml/qqmlregistration.h> #include <QObject> class MyCppObject : public QObject { Q_OBJECT QML_ELEMENT public: MyCppObject(QObject *parent = nullptr) : QObject(parent) {} Q_PROPERTY(QQuickItem *myProperty READ myProperty WRITE setMyProperty NOTIFY notifyMyProperty) QQuickItem *myProperty() { return m_myProperty; } void setMyProperty(QQuickItem *item) { emit notifyMyProperty(); m_myProperty = item; } Q_PROPERTY(QQuickItem *myProperty2 READ myProperty2 WRITE setMyProperty2 NOTIFY notifyMyProperty2) QQuickItem *myProperty2() { return m_myProperty2; } void setMyProperty2(QQuickItem *item) { emit notifyMyProperty2(); m_myProperty2 = item; } private: QQuickItem *m_myProperty; QQuickItem *m_myProperty2; signals: void notifyMyProperty(); void notifyMyProperty2(); };
CMakeLists.txt
を持ちます:
project(mymodule VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 6.5 REQUIRED COMPONENTS Quick) qt_standard_project_setup(REQUIRES 6.5) qt_add_executable(appmymodule main.cpp ) qt_add_qml_module(appmymodule URI mymodule VERSION 1.0 QML_FILES Main.qml HelloWorld.qml SOURCES mycppobject.cpp mycppobject.h ) target_link_libraries(appmymodule PRIVATE Qt6::Quick )
C++ 依存関係Quick
が宣言されており、このクラスはコンパイル可能で、QQuickItem インクルードが見つかります。また、mymodule
はQtQuick に依存しません。
では、QMLのエイリアスでmyProperty2
をmyProperty
にバインドしてみましょう。プログラムは実行されますが、コンパイラなどのQMLツールはmyProperty
の使用について警告を発します:
import mymodule MyCppObject { id: root myProperty: myProperty2 // not ok: No type found for property "myProperty". [missing-type] }
警告メッセージが表示される理由は、QMLのコードの中で、myProperty
の型QQuickItem
と、そのQMLの対応する型Item
が知られていないからです:mymoduleの依存関係 'QtQuick' はCMakeLists.txt
の中で宣言されていません。
この警告を修正するには、CMakeLists.txt
で依存関係を追加してください:
qt_add_qml_module(mymodule URI mymodule ... # declarare QML dependency to QtQuick module DEPENDENCIES QtQuick ... )
これで警告は消えるはずです!
モジュールの依存関係の宣言も参照してください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。