欠落しているタイプ

この警告カテゴリのスペルは[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 が宣言されています。また、mymoduleQtQuick に依存していません。

では、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モジュールに、myPropertymyProperty2 の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 インクルードが見つかります。また、mymoduleQtQuick に依存しません。

では、QMLのエイリアスでmyProperty2myProperty にバインドしてみましょう。プログラムは実行されますが、コンパイラなどの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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。