如何通过import <Module>.<Submodule>导入自定义QML组件及相关配置
QML模块配置与导入问题
项目目录结构
Myproject |- KmcUI |- Controls |- MyComponent1.qml |- qmldir |- impl |- InternalComponent.qml |- qmldir |- Window |- MyComponent2.qml |- qmldir |- MyComponent3.qml |- qmldir |- main.qml
疑问
- 是否需要分别在
./KmcUI、./KmcUI/Controls和./KmcUI/Window目录下编写3个qmldir文件?如果需要,该如何编写? - 如何配置导入路径?我尝试将
absolute/path/to/Project/KmcUI添加到QML_IMPORT_PATH环境变量、.pro文件以及通过QQmlEngine::addImportPath()方法配置,但均未生效。
编辑补充:
已按建议为每个子模块编写qmldir文件,目录结构如上。例如.\KmcUI\Window\qmldir内容如下:
module KmcUI.Window MyComponent2 1.0 MyComponent2.qml
但问题仍未解决,且无法在MyComponent1.qml中通过import KmcUI.Controls.impl导入InternalComponent组件。
解决方案
1. qmldir文件的必要性与编写规范
需要分别在KmcUI、KmcUI/Controls、KmcUI/Window以及KmcUI/Controls/impl目录下编写qmldir文件,每个目录对应一个QML模块:
- ./KmcUI/qmldir:定义根模块,同时声明子模块让引擎识别
module KmcUI MyComponent3 1.0 MyComponent3.qml module KmcUI.Controls module KmcUI.Window - ./KmcUI/Controls/qmldir:定义Controls模块,同时声明impl子模块
module KmcUI.Controls MyComponent1 1.0 MyComponent1.qml module KmcUI.Controls.impl - ./KmcUI/Window/qmldir:当前写法正确,保持即可
module KmcUI.Window MyComponent2 1.0 MyComponent2.qml - ./KmcUI/Controls/impl/qmldir:必须添加该文件才能让内部模块生效
module KmcUI.Controls.impl InternalComponent 1.0 InternalComponent.qml
2. 导入路径配置的正确方式
你之前的路径配置有误,正确的导入路径应该是项目根目录(absolute/path/to/Myproject),而非KmcUI目录。QML引擎会从导入路径开始匹配模块名对应的目录结构:
- .pro文件配置:
QML_IMPORT_PATH += $$PWD # 或直接写绝对路径 # QML_IMPORT_PATH += /absolute/path/to/Myproject - QQmlEngine代码配置:
engine.addImportPath("/absolute/path/to/Myproject"); - 环境变量配置:
Linux终端:
Windows系统:在系统环境变量中添加export QML_IMPORT_PATH=/absolute/path/to/Myproject:$QML_IMPORT_PATH/absolute/path/to/Myproject
配置完成后,在main.qml中导入模块即可使用组件:
import KmcUI 1.0 import KmcUI.Controls 1.0 import KmcUI.Window 1.0 MyComponent3 {} MyComponent1 {} MyComponent2 {}
在MyComponent1.qml中导入内部模块:
import KmcUI.Controls.impl 1.0 InternalComponent {}
内容的提问来源于stack exchange,提问作者Kamichanw
相关产品推荐
相关产品推荐

