缺失类型

此警告类别有多个警告

无法推断别名类型

发生了什么?

别名属性指向的属性具有 C++ 类型,但找不到其 QML 对应类型。这可能是由于导入了一个未在其他模块中声明其 QML 依赖的 QML 模块。

注意:如果您正在导入具有外部依赖的 QML 模块,请验证它们是否已实际安装,以及它们的模块是否最终位于一个 导入路径 上。

警告还可能表明别名引用的属性类型没有 QML 对应类型。引用的属性类型可能缺少 QML_ELEMENT 宏,例如。在这种情况下,请参阅从 C++ 定义 QML 类型概述 - QML 与 C++ 集成

为什么这很糟糕?

QML 工具无法找到 C++ 类型的 QML 对应类型:编译器无法将此属性别名编译为 C++,并且 qmllint 以及 QML 语言服务器也无法分析此属性别名。

示例

让我们假设我们的 QML 模块有一个 C++ 类,其中包含一个名为 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
)

声明了 C++ 依赖项 Quick,因此此类可以编译,并且可以找到 QQuickItem 的包含文件。此外,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 代码中,myProperty 的类型 QQuickItem 和其 QML 对应类型 Item 是未知的,即使您已经在 QML 文件中有 import QtQuick。这是因为同一类型可以在不同的模块中以不同的属性暴露多次:实际上,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语言服务器都无法分析此属性绑定。

示例

让我们创建一个具有两个属性C++类,myPropertymyProperty2

#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是未知的:在CMakeLists.txt中未声明mymodule的依赖项'QtQuick'。

您可以通过在 CMakeLists.txt 中添加依赖关系来解决此警告

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

现在,应该不再有警告了!

另请参阅: 声明模块依赖关系

© 2024 The Qt Company Ltd. 包含在内的文档贡献者的版权属于各自的所有者。此处提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款提供的。Qt及其相关标志是The Qt Company Ltd.在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。