使用QML进行应用程序开发简单而强大。但是Qt C ++可以提高性能,提供许多功能并且不易出错。这篇文章向您展示了如何创建利用这两种语言的应用程序。
文章目录
如何在C ++和QML之间进行通信
为应用程序的不同功能选择正确的语言非常重要。将C ++组件与QML集成,使您的移动应用程序开发更上一层楼。
QML中编码的优点
Qt Quick(QML + Javascript)具有强大的功能。这种声明性脚本语言非常强大,与其他编程语言相比,它可以节省高达60%的代码行。
与使用C++进行开发相比,QML编码有几个优点:
- 使用QML + JavaScript进行编码非常容易学习,并且可以大量减少所需的代码量。
- 状态,信号或属性绑定等语言概念可以节省大量时间。
- QML使添加动画变得简单。您可以使用简单的动画组件为QML类型的每个属性设置动画。
- QML具有可扩展性和灵活性。例如,您可以在线扩展具有新属性和功能的对象。无需为小扩展创建新的可重用类型。
- QML渲染引擎提供了出色的性能。渲染器使用C ++ Qt并依赖于硬件加速的场景图。这使得它甚至足以为高性能游戏提供动力。
何时使用C ++代替
使用C ++开发Qt应用程序也具有优势。对于某些情况,您需要仅适用于Qt C ++的功能。此外,C ++是快速且类型安全的。这样可以为长时间运行和数据密集型计算提供最佳性能。
对于这些示例,您将选择C ++而不是QML:
- 原生C ++代码是数据密集型操作的正确选择。它将胜过解释的QML / JavaScript代码。
- C ++代码是类型安全的,并编译为目标代码。对于稳定性和安全性很重要的部分,使用C ++有助于减少应用程序的错误。
- Qt C ++组件提供了与QML类型不同的功能,在某些情况下还提供了更多功能。例如,高级网络功能。
- 也可以将C ++与Android(通过JNI)或iOS(Obj-C或Swift)的本机代码混合使用。这允许为QML提供这样的本机功能。
为了充分利用您的应用程序,您可以充分利用这两种语言的优势。
如何从QML访问C ++对象
在我们讨论任何细节之前,让我们首先使用Qt Creator创建一个简单的项目。
在项目中创建C ++类
- 创建新的应用程序项目后,首先使用以下基本结构替换Main.qml中的代码:
import QtQuick 2.5
App {
NavigationStack {
Page {
title: "Integrate C++ and QML"
}
}
}
它只包括主App窗口和NavigationStack中的Page,以显示保存页面标题的导航栏:
-
这对于我们的基本QML设置已经足够了。让我们继续创建一个新的C ++类。首先,在Qt Creator中右键单击项目的C ++“Sources”文件夹,选择“Add New …”并在C ++部分中选择“C ++ Class”模板:
-
然后将“ MyGlobalObject”设置为Class Name并选择“Include QObject”以包含QObject类型,因为我们的类用于QML的主要要求是从QObject派生。
完成向导后,您的项目在“Headers”文件夹中包含类定义myglobalobject.h,在项目的“Sources”文件夹中包含实现myglobalobject.cpp。
请注意,* .pro配置现在还包括HEADERS和SOURCES配置中的新文件。
使用QML实现带有信号和插槽的C ++类
- 打开myglobalobject.h并添加一些代码以从QObject派生 - 所需的include语句已经到位:
#ifndef MYGLOBALOBJECT_H
#define MYGLOBALOBJECT_H
#include <QObject>
class MyGlobalObject : public QObject
{
Q_OBJECT
public:
MyGlobalObject();
};
#endif // MYGLOBALOBJECT_H
不要忘记在类定义中添加Q_OBJECT预处理器宏。
- 现在我们有了一个新的QObject,让我们添加一个稍后我们将从QML调用的简单方法。要使该方法在QML中可用,需要将其标记为公共插槽:
class MyGlobalObject : public QObject
{
Q_OBJECT
public:
MyGlobalObject();
public slots: // slots are public methods available in QML
void doSomething(const QString &text);
};
3.要完成我们的基本类,请打开myglobalobject.cpp并添加doSomething()的方法实现。我们保持简单,只将给定的文本打印到调试输出。
#include "myglobalobject.h"
#include <QDebug>
MyGlobalObject::MyGlobalObject()
{
// perform custom initialization steps here
}
void MyGlobalObject::doSomething(const QString &text) {
qDebug() << "MyGlobalObject doSomething called with" << text;
}
将对象公开为QML作为Context属性
在QML中使用C ++对象