You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:23:20