這里展示了c++加載qml文件的三種方式以及qml文件中根節點的訪問
準備
在創建工程的初期,遇到了一個問題,cmake文件以前都是系統自動生成的,不需要我做過多的操作修改,但是,加載qml的程序主函數是需要用到QGuiApplication,qtcreater沒法自動生成相關的項目,cmake得自己手搓了,嗚嗚嗚,我是最煩手搓這玩意,東拼西湊搞半天,搞不好這個庫沒找到,那個庫沒找到,回頭得系統的學一下這個了。。。。
#CMakeLists.txt
#最低版本號
cmake_minimum_required(VERSION 3.20)#項目名稱
project(cmake_qml_cpp)
#自動尋找所需qt套件
find_package(Qt6 COMPONENTS Quick REQUIRED)set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)#添加到項目
add_executable(${PROJECT_NAME}main.cppsource.qrc
)#尋找到的套件要連接進來,不然會找不到一些庫文件
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Quick)
這是我寫的cmake,導入的庫是qt6的quick,其他版本要改哦
文件結構
qml程序是隨便寫的幾個,因為要展示三種加載方式,先上運行效果圖?
第一種方式:QQmlApplicationEngine
代碼:
//第一種方式QQmlApplicationEngine//結合了QQmlEngine和QQmlComponent,這一步已經可以達到顯示效果了QQmlApplicationEngine appeng("qrc:/qml/main.qml");//獲取組件的根節點,就是qml程序的windowauto objs=appeng.rootObjects();auto win=static_cast<QQuickWindow*>(objs[0]);win->setX(0);win->setTitle("修改后的");
這種最簡單,引擎直接加載,并且可以獲取根節點來修改屬性
第二種方式:QQuickView
代碼:
QQuickView view;view.setSource(QUrl("qrc:/qml/2.qml"));view.setWidth(500);view.setHeight(500);view.show();
這種方式要注意qml中不可以有window作為根節點,他會自動創建一個的
第三種方式:QQmlEngine和QQmlComponent相結合
//第三種方式//qqmlengine和qqmlcomponent相結合QQmlEngine eng;QQmlComponent com(&eng);//加載qml內容,下面的是用loadurl的方式,還有一種是直接調用setdata,在里面直接上qml文本語言,我不習慣,就這樣吧com.loadUrl(QUrl("qrc:/qml/3.qml"));if(com.isError()){qDebug()<<"com的錯誤:"<<com.errorString();}//創建對象,為了管理對象生命周期,將其先轉換為window指針再交給智能指針管理std::unique_ptr<QQuickWindow>ct(static_cast<QQuickWindow*>(com.create()));ct->show();ct->setWidth(400);ct->setHeight(400);
這個就有點像自己純手工搭建了,qqmlengine是引擎,一般component共用一個引擎,我這里使用load的方式加載,setdata是那種qml語言加上文本語言像\n什么的,不想搞,qml還有提詞,獲取錯誤就不說了,管理對象生命周期的問題,我是覺得應該有對象樹系統管理比較好,這里使用智能指針管理,先創建對象,再強制轉換程qquickwindow指針交給unique_ptr管理。