【QT学习】QT中新建一个3D的qml例子,关闭程序的时候报crash

现象:按照qt中模板新建一个3D的项目,关闭窗口的时候报错:

Starting /home/ubuntu/QtProj/test/test3d/build-test_3d-Desktop_Qt_5_10_1_GCC_64bit-Debug/test_3d...
QML debugging is enabled. Only use this in a safe environment.
qml: THREE.Canvas3DRenderer 74
The program has unexpectedly finished.
The process was ended forcefully.
/home/ubuntu/QtProj/test/test3d/build-test_3d-Desktop_Qt_5_10_1_GCC_64bit-Debug/test_3d crashed.

自己的操作步骤:

(1)选择QT自带模板

(2)

(3) 使用three.js

(4)运行qt模板的程序出现。

(5) 关闭程序窗口出现:

 (6)修改代码,加入如下一行:

在代码new THREE.Canvas3DRenderer之前加入:
var textureLoader = new THREE.TextureLoader();
var sphereTexture = textureLoader.load("qrc:/plutomap1k.jpg", function(){});
其中,图片随便选一个。

运行程序并关闭后报错消失。

说明:自己也不知道为什么,自己是通过查看qt带的canvas 3D的example(cellphone以及planets)排查的,如果有知道原因或者其他方法的请及时告知留言。

### Qt 6.5.3 QML组件创建时程序崩溃的解决方案 在使用Qt 6.5.3创建QML组件时,如果程序出现崩溃问题,通常可能是由于以下原因之一导致:动态加载资源失败、组件初始化错误、或与底层C++代码的交互异常。以下是可能的原因及解决方法: #### 1. **检查QML组件的导入路径** 确保所有QML组件的导入路径正确无误。如果路径错误,可能导致组件无法正常加载,从而引发崩溃。例如,在`.qml`文件中使用`import`语句时,需确认路径是否准确[^1]。 ```qml import QtQuick 2.15 import QtQuick.Controls 2.15 ApplicationWindow { visible: true width: 640 height: 480 title: "QML Crash Solution Example" Component { id: crashComponent Rectangle { width: 100 height: 100 color: "blue" } } Loader { id: loader sourceComponent: crashComponent anchors.centerIn: parent } } ``` #### 2. **验证C++与QML的交互逻辑** 如果QML组件依赖于C++注册的对象或信号槽机制,需要确保C++端的实现正确无误。例如,通过`qmlRegisterType`或`setContextProperty`注册的类型或属性必须有效。如果注册失败或对象未正确初始化,可能会导致程序崩溃[^2]。 ```cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> class MyCppObject : public QObject { Q_OBJECT public: explicit MyCppObject(QObject *parent = nullptr) : QObject(parent) {} }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; MyCppObject myCppObject; engine.rootContext()->setContextProperty("myCppObject", &myCppObject); const QUrl url(u"qrc:/main.qml"_qs); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); } ``` #### 3. **排查动态加载(Loader)相关问题** 如果使用`Loader`动态加载QML组件,需确保`source`或`sourceComponent`属性设置正确。如果加载的组件不存在或路径错误,可能会导致崩溃。此外,动态加载的组件应避免引用未定义的资源[^1]。 ```qml Loader { id: dynamicLoader source: "NonExistentComponent.qml" // 确保路径存在 active: true } ``` #### 4. **调试工具的使用** 利用Qt Creator内置的调试工具或命令行工具(如`qmlscene --trace`)来捕获崩溃时的日志信息。这些工具可以帮助定位具体崩溃原因。例如,`qmlprofiler`可用于分析性能瓶颈和潜在的崩溃点[^3]。 ```bash qmlscene --trace your_qml_file.qml ``` #### 5. **确保环境配置正确** 根据引用内容,确保开发环境中的Java JDK版本为推荐的11版本,以避免因环境配置不当导致的潜在问题。同时,确认Qt Creator已正确配置SDK和NDK(如果是Android开发),并确保Windows系统位数与安装软件一致[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值