欠落しているタイプ

この警告カテゴリのスペルは[missing-type] です。

エイリアスの型を推測できません

何が起こったのでしょうか?

エイリアス・プロパティが C++ 型のプロパティを指していて、そのプロパティに対応する QML 型が見つかりませんでした。これはQMLモジュールをインポートする際に、他のモジュールとのQML依存関係を宣言していない場合に起こります。

注意: QMLモジュールをインポートする場合、そのモジュールが実際にインストールされ、インポートパスにそのモジュールが含まれていることを確認してください。

この警告は、エイリアスが参照するプロパティの型にQMLの対応するものがないことを示しているのかもしれません。例えば、参照されているプロパティの型にQML_ELEMENT マクロがない可能性があります。このような場合は「C++からQMLの型を定義する」または「概要 - QMLとC++の統合」を参照してください。

なぜこのようなことが起こるのでしょうか?

QMLツールはC++の型のQMLの対応するものを見つけることができません:コンパイラはこのプロパティのエイリアスをC++とqmllintにコンパイルすることができません。 QML Language Serverはこのプロパティエイリアスを解析できません。

QMLモジュールにプロパティmyProperty を持つ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; }

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++の統合」を参照してください。

なぜこのようなことが起こるのでしょうか?

QMLツールはC++型に対応するQML型を見つけることができません:コンパイラはこのプロパティバインディングを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
    ...
)

これで警告は消えるはずです!

モジュールの依存関係の宣言も参照してください

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.