Qt Quick项目中QtCharts正确用法:QML在qmlscene可用但程序崩溃
Qt 6.9 MinGW环境下Qt Quick项目QtCharts组件部署崩溃/组件找不到问题
问题描述
在Windows系统使用Qt 6.9与MinGW环境开发Qt Quick项目,引入QtCharts组件(如ChartView、PieSeries等)时,qmlscene运行QML文件完全正常,但构建后的应用启动即崩溃,或提示:
PieSlice was not found. Did you add all imports and dependencies?
已执行的操作:
- CMake配置中使用
qt_add_qml_module() - 运行
windeployqt --qmldir qml部署依赖 - QML文件中正确导入
QtCharts - 新建仅包含ChartView的最小项目,问题依然存在,但相同QML在
qmlscene中可正常显示
解决方案
1. 完善CMake的QML模块依赖声明
当前CMakeLists.txt已链接Qt6::Charts,但需在qt_add_qml_module中明确声明依赖QtCharts的QML模块,确保构建系统自动包含相关插件。修改如下:
qt_add_qml_module(apprtm_gui_test URI rtm_gui_test VERSION 1.0 QML_FILES Main.qml DEPENDENCIES QtCharts # 新增此行,指定依赖QtCharts QML模块 )
2. 修正windeployqt执行命令
windeployqt需直接指向构建后的可执行文件,而非仅指定qmldir。正确命令示例:
windeployqt --qmldir ./qml --release ./build/apprtm_gui_test.exe
(替换./build/apprtm_gui_test.exe为你的实际可执行文件路径)
3. 手动验证并补充QtCharts插件
部署完成后,检查可执行文件所在目录是否存在QtCharts子文件夹,结构如下:
./QtCharts/ qmldir libQt6Charts.dll libQt6ChartsQml.dll
若缺失,从Qt安装目录的qml/QtCharts文件夹复制所有文件到上述路径。
4. 主动注册QtCharts模块(可选)
如果上述步骤仍无效,可在main.cpp中主动注册QtCharts模块:
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtCharts> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterModule("QtCharts", 6, 9); // 版本号对应你的Qt 6.9 QQmlApplicationEngine engine; QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.loadFromModule("rtm_gui_test", "Main"); return app.exec(); }
用户提供的相关代码
CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(rtm_gui_test VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(QT_QML_GENERATE_QMLLS_INI ON) find_package(Qt6 REQUIRED COMPONENTS Quick Charts) qt_standard_project_setup(REQUIRES 6.8) qt_add_executable(apprtm_gui_test main.cpp ) qt_add_qml_module(apprtm_gui_test URI rtm_gui_test VERSION 1.0 QML_FILES Main.qml ) set_target_properties(apprtm_gui_test PROPERTIES MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_link_libraries(apprtm_gui_test PRIVATE Qt6::Quick Qt6::Charts ) include(GNUInstallDirs) install(TARGETS apprtm_gui_test BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
Main.qml
import QtQuick import QtQuick.Controls import QtCharts ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Hello World") ChartView { title: "Line Chart" anchors.fill: parent antialiasing: true LineSeries { name: "Line" XYPoint { x: 0; y: 0 } XYPoint { x: 1.1; y: 2.1 } XYPoint { x: 1.9; y: 3.3 } XYPoint { x: 2.1; y: 2.1 } XYPoint { x: 2.9; y: 4.9 } XYPoint { x: 3.4; y: 3.0 } XYPoint { x: 4.1; y: 3.3 } } } }
main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.loadFromModule("rtm_gui_test", "Main"); return app.exec(); }
内容的提问来源于stack exchange,提问作者antonio nobrega
相关产品推荐
相关产品推荐

