困擾好久的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,這樣就完美的解決了資源加載的各類未知了。