打包¶
测试环境: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
),通常只需拷贝一次。