当前位置: 首页 > news >正文

c++加载qml文件

这里展示了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管理。

http://www.lryc.cn/news/601605.html

相关文章:

  • 【学习笔记】DexMimicGen:通过模仿学习实现双臂灵巧操作的自动化数据生成
  • 小白成长之路-Ansible自动化(一)
  • 小白投资理财 - 从换手率和成交量分析股票趋势
  • 【机器学习深度学习】NLP评价指标 BLEU 和 ROUGE
  • 扩展组件(uni-ui)之uni-group
  • Dify 本地化部署深度解析与实战指南
  • C语言自定义数据类型详解(四)——联合体
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现PCB上二维码检测识别(C#代码UI界面版)
  • 2.安装CUDA详细步骤(含安装截图)
  • JavaEE--3.多线程
  • [N1盒子] 斐讯盒子N1 T1通用刷机包(可救砖)
  • [硬件电路-96]:什么是闭环反馈?什么是闭环正反馈控制?什么是闭环负反馈控制?
  • Java面试精进:测试、监控与序列化技术全解析
  • 【模电笔记】—— 波形发生电路(波形振荡器)
  • Redisson的布隆过滤器
  • 安卓打包遇到问题
  • 重温经典,小巧方便的 WinXP 来啦!提供离线驱动
  • net8.0一键创建支持(Kafka)
  • 深度学习在自动驾驶车辆车道检测中的应用
  • 命令行和neovim的git操作软件-lazygit
  • GO语言 go get 下载 下来的包存放在哪里
  • MMAP 机制通俗易懂
  • 如何在 Ubuntu 24.04 或 22.04 中更改 SSH 端口
  • Qt C++动态库SDK在Visual Studio 2022使用(C++/C#版本)
  • 图像处理:第二篇 —— 选择镜头的基础知识及对图像处理的影响
  • sealos 方式安装k8s5节点集群
  • K8S 九 安全认证 TLS
  • 记录几个SystemVerilog的语法——时钟块和进程通信
  • 系统集成项目管理工程师【第九章 项目管理概论】 - 价值交付系统
  • C51:使用超声波测量距离