/s/1tEVgmwGCV5HvrSWNxQrtHA 提取码: e7ux
前言:
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文件中添加相应的元素或自己编写控件再添加。
有疑问加站长微信联系(非本文作者)