困扰好久的Component is not ready问题,网络上有不少种介绍的解决办法,可是都是未能真正的解决问题。如今就根据本人的使用状况简单的讨论分析。javascript
提示Component is not ready有如下几种状况:html
一、真的代码写错了,本身经过折叠代码行的方式进行检查java
二、组件加载失败,主要因为路径配置失败,或者资源配置失败,我属于后者bash
首先咱们须要确认和定位问题。使用以下qml代码进行定位,可以知道具体的错误缘由。网络
网上有不少种说法app
在C++层用qDebug测试
在QML、JS层用console就能够了。ui
问题提示很简单:is not Type,是组件识别失败致使的。code
那么就要去尝试加载组件,而后网上的方法不少种,列出常见的方法htm
一、在C++层增长qml组件的目录,测试失败
engine.addImportPath(QString::fromLatin1("%1/../../../src/%2").arg(QCoreApplication::applicationDirPath(), QString::fromLatin1("qml")));
二、在pro文件中设置qml组件的目录
#QML_IMPORT_PATH = -L$$PWD/qml/controls #QML_IMPORT_TRACE=1 #QML2_IMPORT_PATH += -L$$PWD/qml/controls
尝试了不少种语法,不管是QML仍是QML2,不管是相对路径仍是绝对路径,都是失败的。彻底不起做用
测试上述两种方法觉得是路径有问题,尝试输出导出路径
// for(QString path : engine.importPathList()) // { // qDebug() << path; // }
在C++中执行输出路径,发现路径彻底没有问题,真的很费解。这个就没有办法了。
三、在qml中使用import
import QtQuick 2.0 import QtCanvas3D 1.1 import QtQuick.Controls 1.1 import "../qml/MyComponent" as Com
觉得这样总能够了吧,结果仍是铩羽而归呀,这个配置让人头疼许久。
最后采用终极的解决方法,配置资源,使用资源必需要在qrc中添加,添加
添加成功后依旧是各类不行,这个理论上是彻底没有问题的,变态的qt资源加载方式,会让你恶心到不知道为何恶心。
意外的测试中发现,资源若是不是在同一个路径下,加载就会出现各类错误,例如找不到资源(实际上是真的存在的),问题被确认:
一、使用的qml界面必须与其使用的资源在qrc的定义中保持在同一路径下,不然加载失败。或者使用绝对路径去加载资源。
二、那么因为资源众多,通常都会采用分文件夹的方式管理,怎么让资源在qrc中保持在同一个路径下。发现了巨坑的别名设置
经过别名设置,能够实如今qrc中将不一样文件夹下的资源,变成在一个文件夹。别名支持文件夹设置哦,例如
/res/threejs.js
这样的话threejs文件就在qrc展现中调整到res文件夹。
最终的文件结构以下:
如此这般操做,资源访问将均可以直接访问,全部的资源都放置在同一个文件夹下。
binggo,这样就完美的解决了资源加载的各类未知了。