知识屋:更实用的电脑技术知识网站
所在位置:首页 > 科技

QML与C++混合编程

发表时间:2022-03-25来源:网络

 之前写的文章都是一段一段的,现在整合起来,预估又是一段长臭文...

零、前言

1、先看一下相关类的继承关系:

①、视图关系

 

 ②、QML加载相关

 

 上方图参考:https://blog.csdn.net/qq_34139994/article/details/105195447

 

2、关于Qt与QML的个人理解

一切的一切,底层都是C++实现的,我们通过Qt封装好的C++类,如视图、引擎等,去加载QML文件,底层C++读取这些QML文本后,动态实例化相关对象,最终呈现在界面上。

 

 一、在Qt中加载QML的方式

1、搭配 Window

2、 搭配 Item

3、 加载 QML【Item】

见之前文章:https://www.cnblogs.com/judes/p/15606042.html

注意本文以Quick工程为例,非Widget工程,故选择的是前两种加载方式

 

二、传递C++类型/对象给QML使用

1、注册

 有非常多的注册模板函数可供使用,相关信息在手册里直接搜索..

int ype int pe int creatableType int            //注册一个接口,不可被实例化,可以使用类型名引用【多态】 void int int nstance int ype         //注册单例类型,可安全代替setContextProperty int               //注册一个可实例化对象,最常用 int ilable int eMetaObject int eType       //注册不可被实例化的对象,可以使用其中的枚举

举例:创建一个C++的Udp类,并注册给QML用

//cpp ("Myudp.module",1,0,"Myudp"); //qml
import Myudp.module 1.0
Myudp{
id:udp
}

 需要添加头文件:

#include

 

2、设置上下文

三种加载方式使用的工具是:



 

它们都具有一个函数rootContext,返回;

提供函数:setContextProperty【注册单个上下文属性】、setContextProperties【注册多个上下文属性】。

这个上下文属性其实就是在C++里实例化了的对象,效果与上面的注册单例ype一致。

举例:

//C++ Myudp udp; engine; engine.rootContext()->setContextProperty("udp",&udp);//注册对象 //QML udp.initUdpSlot()

 注意:需要先设置上下文,再连接qml:

 

 

三、封装C++对象

上面只是QML里能够用简单访问到C++对象,是不足以支持实际项目开发的,故需要对C++对象进行封装。

见之前的文章:https://www.cnblogs.com/judes/p/11242922.html

Qt提供了这些宏用于封装:

1、信号与槽 C++类中的信号与槽都可以在QML中访问 2、C++类的成员函数,Q_INVOKABLE Q_INVOKABLE void function(); 3、C++类的枚举,Q_ENUMS Q_ENUMS (enumName) 4、C++的属性,Q_PROPERTY Q_PROPERTY( text READ text WRITE setText NOTIFY textChanged)

 

1、例子:封装一个颜色生成器给QML使用,C++暴露属性、信号、槽、函数、枚举,QML使用【信号的使用有多种方式】

①、MyColor.h

#ifndef MYCOLOR_H #define MYCOLOR_H #include #include #include //注册函数需要 #include #include class MyColor : public { Q_OBJECT //枚举暴露 Q_ENUMS(RECT_COLOR) //属性暴露,QML可直接使用属性[动态绑定、获取、设置,前提是匹配了对应函数] Q_PROPERTY( color READ getColor NOTIFY colorChanged) Q_PROPERTY( info READ getInfo WRITE setInfo) //属性相关 public: explicit MyColor( *parent = nullptr); inline getColor(){return m_cur_color;} inline getInfo(){return m_info;} inline void setInfo( info){m_info = info;qDebug()findChild(""); if (){ ::connect(, SIGNAL(clicked()), &app, SLOT(quit())); }

见之前文章:https://www.cnblogs.com/judes/p/11243242.html

 

 

七、进阶之MVC编程

MVC编程也是QML与C++的混合编程,通常C++提供Model也就是数据,QML提供View也就是视图。见之前文章:

ListView:https://www.cnblogs.com/judes/p/13450897.html

MVC:https://www.cnblogs.com/judes/p/15622972.html

收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜