打包¶
测试环境:Qt 6.8
在纯 QWidget 项目中,直接使用以下命令进行打包:
但是,在项目中混用 QML 和 QWidget 时,打包方式不同。尝试在 windeployqt6 后添加 --qmldir 参数:
测试结果无效。对比 Qt 示例生成文件 和 VS2022 编译项目生成文件 后,发现问题与 --qmldir 无关。
1 链接可执行程序¶
cmake 配置如下:
set(BINDIR bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${BINDIR})
qt_add_qml_module(AIxyz
    URI EXE_RESOURCES
    VERSION 1.0
    QML_FILES resources/qml/Mesh3DBrowser.qml
    NO_RESOURCE_TARGET_PATH
)
该配置使可执行文件和 EXE_RESOURCES 文件夹位于不同目录。打包时仅拷贝了可执行文件,导致缺失 QML 资源文件。
解决方案:将 EXE_RESOURCES 文件夹放在可执行文件所在目录中,确保打包工具能够加载所有资源。--qmldir 则无需添加。
2 链接 library¶
项目中还可能需要通过链接库文件引入 qml,CMake 配置示例如下:
```cmake
 add_library(SimpleBorder QuickWidgetManager.cpp QuickWidgetManager.h)
target_include_directories(SimpleBorder
 PUBLIC
 \(<BUILD_INTERFACE:\)>
 \(<INSTALL_INTERFACE:\)>
 )
qt_add_qml_module(${PROJECT_NAME}
 URI SimpleBorder_RSS
 VERSION 1.0
 QML_FILES
 "MediaPlayer.qml"
 "Mesh3DBrowser.qml"
 "controls/PlaybackControl.qml"
 ...
 RESOURCES
 "images/backward10.svg"
 ...
 )
 
 ```cmake
add_executable(AIxyz WIN32 ${SRCS})
target_link_libraries(AIxyz PRIVATE
    Qt6::Widgets
    ...
)
target_link_libraries(AIxyz PRIVATE
    SimpleBorder
    SimpleBorderplugin
)
解决方案:在打包时,将所有 *.qml 文件复制到可执行程序所在目录,例如新建一个 ./quick 文件夹,将所有 QML 文件放入其中。运行 windeployqt6 后可以删除该文件夹。如果 QML 程序不引入新的模块(import),通常只需拷贝一次。