缺失类型
此警告类别有多个警告
无法推断别名类型
发生了什么?
别名属性指向的属性具有 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++类,myProperty
和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(); };
以及以下 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.在芬兰和其他国家/地区的商标。所有其他商标均为各自所有者的财产。