楼主: aiwudidefenshou
810 1

[程序分享] C++ Qt6 QML入门进阶与项目实战 [推广有奖]

  • 0关注
  • 0粉丝

博士生

32%

还不是VIP/贵宾

-

威望
0
论坛币
120 个
通用积分
73.5015
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
2235 点
帖子
167
精华
0
在线时间
59 小时
注册时间
2023-7-25
最后登录
2025-9-19

楼主
aiwudidefenshou 发表于 2024-12-9 18:49:21 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
前言:
QML和 C++对象可以通过,signals,slots和 属性修改进行交互。对于一个C++对象,任何数据都可以通过Qt的 Meta-Object System暴露给QML(何总方法,后面介绍),同时,任何的QML对象数据通过Meta-object system在C++端直接访问。
在实际的项目中很多地方会用到QML与Qt C++交互。在这里总结了若干方法供大家参考,欢迎大家指导和拍砖。

在这里不外乎有三种方法:
1. 把Qt C++中的对象或类型暴露给 QML端,供QML端使用。(官方说法是“嵌入”而非“暴露”,比较文明。- -b)
2. QML中的Signal Handler(相当于Qt C++发送信号给QML端,QML端的Signal Handler进行处理)。
3. 在Qt C++端创建QML对象,既然对象都有了。那你想怎么样它就怎么样它呗。

一、QML与C++为什么要混合编程
QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧。

二、QML访问C++概述
Qt集成了QML引擎和Qt元对象系统,使得QML很容易从C++中得到扩展,在一定的条件下,QML就可以访问QObject派生类的成员,例如信号、槽函数、枚举类型、属性、成员函数等。

QML访问C++有两个方法:一是在Qt元对象系统中注册C++类,在QML中实例化、访问。二是在C++中实例化并设置为QML上下文属性,在QML中直接使用。与后者相比,前者可以使C++类在QML中作为一个数据类型,例如函数参数类型或属性类型,也可以使用其枚举类型、单例等,功能更强大。

三、C++在Qt中的核心地位
C++是一种成熟且功能强大的编程语言,它在Qt中扮演着核心的角色。C++的优势在于:
性能: C++提供了接近硬件层面的控制能力,使得应用程序能够实现高性能。
复杂性处理: C++的面向对象特性使其能够处理复杂的业务逻辑和算法。
稳定性: 作为一种广泛使用的编程语言,C++拥有稳定的编译器和大量的库支持。

四、C++与QML的协同工作
在实际开发中,C++和QML并不是孤立的,它们通过Qt的信号和槽机制相互通信和协作。这种协同工作模式允许开发者利用C++的强大性能和QML的灵活性,共同构建高效且用户友好的应用程序。
数据模型: C++可以定义和处理复杂的数据模型,而QML则可以展示这些数据。
逻辑分离: C++负责处理业务逻辑,而QML负责界面展示,实现了逻辑与界面的分离。
性能优化: C++可以处理性能敏感的任务,而QML则专注于提供流畅的用户体验。

五、如何实现可以被QML访问的C++类
C++类要想被QML访问,首先必须满足两个条件:一是派生自QObject类或QObject类的子类,二是使用Q_OBJECT宏。QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。Q_OBJECT宏必须在private区(C++默认为private)声明,用来声明信号与槽,使用Qt元对象系统提供的内容,位置一般在语句块首行。下面例子在QtCreator3.1.2中创建,Projects选择QtQuickApplication,工程名为Gemini,Component选择QtQuick2.2,然后在自动生成的文件中添砖加瓦。

六、在qml文件中输入相应的元素(Item,Rectanger,Image,Canvas等等)。
import QtQuick 2.0
import QtQuick.Window 2.2

Window {
     width: 800
     height: 600
     visible: true
     title: "Test window"
}

在main函数中加载qml引擎需要用到QQmlApplicationEngine类,通过该类加载qml文件。如下:
int main(int argc, char *argv[])
  {
      QGuiApplication app(argc, argv);

      QQmlApplicationEngine engine;
      engine.load(QUrl(QStringLiteral("qrc:/Test.qml"))); 7
      return app.exec();
  }
其中,engine 对象的 load() 方法,需要一个QUrl对象提供qml文件的url路径,这里加载了一个qml文件,即“Test.qml”文件。

运行之后得到空白的窗体。如果想要显示不同的内容,需要在qml文件中添加相应的元素或自己编写控件再添加。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:QML Application Component Projects Private
相关内容:C++项目实战

沙发
aiwudidefenshou 发表于 2024-12-10 19:40:50
参考资料地址:https://pan.baidu.com/s/1slv92lZ0yhsxF_cgSZdkdg 提取码: 76ek

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-22 14:51