Sur cette page

Type manquant

Cette catégorie d'avertissement est orthographiée [missing-type] par qmllint.

Impossible de déduire le type de l'alias

Qu'est-ce qui s'est passé ?

Une propriété alias pointe vers une propriété de type C++ dont la contrepartie QML n'a pas été trouvée. Cela peut être dû à l'importation d'un module QML qui ne déclare pas ses dépendances QML sur d'autres modules.

Remarque : si vous importez des modules QML avec des dépendances externes, vérifiez qu'ils sont effectivement installés et que leurs modules se retrouvent dans un chemin d'importation.

L'avertissement peut également indiquer que le type de la propriété référencée par l'alias n'a pas de contrepartie QML. Le type de propriété référencé peut ne pas avoir la macro QML_ELEMENT, par exemple. Dans ce cas, reportez-vous à Définir les types QML à partir de C++ ou à Vue d'ensemble - Intégration de QML et de C++.

Pourquoi ce problème ?

L'outil QML n'est pas en mesure de trouver la contrepartie QML du type C++ : le compilateur ne peut pas compiler cet alias de propriété en C++ et qmllint ainsi que QML Language Server ne peuvent pas analyser cet alias de propriété.

Exemple

Supposons que notre module QML ait une classe C++ avec une propriété 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();
};

avec la propriété suivante 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
)

La dépendance C++ Quick a été déclarée, de sorte que cette classe peut se compiler et que l'inclusion QQuickItem peut être trouvée. De plus, mymodule n'a pas de dépendance QML sur Qt Quick.

Essayons maintenant d'utiliser myProperty dans un alias en QML. Le programme s'exécutera, mais les outils QML, comme le compilateur, par exemple, se plaindront de l'utilisation de myProperty:

import mymodule

MyCppObject {
    id: root

    property alias myAlias: root.myProperty // not ok: Cannot deduce type of alias [missing-type]
}

La raison du message d'avertissement est que dans le code QML, le type QQuickItem de myProperty et son équivalent QML Item ne sont pas connus, même si vous avez import QtQuick dans votre fichier QML. En effet, le même type peut être exposé plusieurs fois avec différents attributs dans différents modules : mymodule doit en fait être précis quant au type QML de myProperty.

Pour corriger cet avertissement, ajoutez la dépendance dans le fichier CMakeLists.txt:

qt_add_qml_module(mymodule
    URI mymodule
    ...
    # declarare QML dependency to QtQuick module
    DEPENDENCIES QtQuick
    ...
)

Maintenant, l'avertissement devrait disparaître !

Voir aussi Déclarer les dépendances d'un module.

Aucun type trouvé pour la propriété

Qu'est-ce qui s'est passé ?

Un binding a été défini sur une propriété dont le type QML n'a pas été trouvé. Cela peut être causé par un module QML qui ne déclare pas ses dépendances QML sur d'autres modules.

Remarque : si vous importez des modules QML avec des dépendances externes, vérifiez qu'ils sont effectivement installés et que leurs modules se retrouvent dans un chemin d'importation.

L'avertissement peut également indiquer que le type de la propriété n'a pas de contrepartie QML. Le type de propriété peut ne pas comporter la macro QML_ELEMENT, par exemple. Dans ce cas, reportez-vous à la section Définir les types QML à partir de C++ ou à la section Vue d'ensemble - Intégration QML et C++.

Pourquoi est-ce mauvais ?

L'outil QML n'est pas en mesure de trouver la contrepartie QML du type C++ : le compilateur ne peut pas compiler cette liaison de propriété en C++ et qmllint, et ne peut pas non plus analyser cette liaison de propriété. QML Language Server ne peuvent pas analyser cette liaison de propriété.

Exemple

Supposons que notre module QML possède une classe C++ avec deux propriétés, myProperty et myProperty2:

#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();
};

avec 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
)

La dépendance C++ Quick a été déclarée, de sorte que cette classe peut se compiler et que l'inclusion QQuickItem peut être trouvée. De plus, mymodule n'a pas de dépendance QML sur Qt Quick.

Essayons maintenant de lier myProperty2 à myProperty dans un alias en QML. Le programme s'exécutera, mais les outils QML, comme le compilateur, par exemple, se plaindront de l'utilisation de myProperty:

import mymodule

MyCppObject {
    id: root

    myProperty: myProperty2 // not ok: No type found for property "myProperty". [missing-type]
}

La raison de ce message d'avertissement est que dans le code QML, le type QQuickItem de myProperty et son équivalent QML Item ne sont pas connus : la dépendance QtQuick de mymodule n'a pas été déclarée dans CMakeLists.txt.

Pour corriger cet avertissement, ajoutez la dépendance dans le code CMakeLists.txt:

qt_add_qml_module(mymodule
    URI mymodule
    ...
    # declarare QML dependency to QtQuick module
    DEPENDENCIES QtQuick
    ...
)

Maintenant, l'avertissement devrait disparaître !

Voir aussi Déclarer les dépendances d'un module.

© 2026 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.