如何将带有信号与槽的C++代码暴露给QML

使用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 ++类

  1. 创建新的应用程序项目后,首先使用以下基本结构替换Main.qml中的代码:

import QtQuick 2.5

App {
 NavigationStack {
   Page {
     title: "Integrate C++ and QML"
   }
 }
}

它只包括主App窗口和NavigationStack中的Page,以显示保存页面标题的导航栏:
在这里插入图片描述

  1. 这对于我们的基本QML设置已经足够了。让我们继续创建一个新的C ++类。首先,在Qt Creator中右键单击项目的C ++“Sources”文件夹,选择“Add New …”并在C ++部分中选择“C ++ Class”模板:

  2. 然后将“ MyGlobalObject”设置为Class Name并选择“Include QObject”以包含QObject类型,因为我们的类用于QML的主要要求是从QObject派生。

完成向导后,您的项目在“Headers”文件夹中包含类定义myglobalobject.h,在项目的“Sources”文件夹中包含实现myglobalobject.cpp。

请注意,* .pro配置现在还包括HEADERS和SOURCES配置中的新文件。

使用QML实现带有信号和插槽的C ++类

  1. 打开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预处理器宏。

  1. 现在我们有了一个新的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 ++对象

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值