QT:QML与C++交互

news2024/12/23 23:47:58

目录

一.介绍

二.pro文件添加模块

三.h文件

四.cpp文件

五.注册

六.调用

七.展示效果

八.代码

1.qmlandc.h

2.qmlandc.cpp

3.main.cpp

4.qml


一.介绍

在 Qt 中,QML 与 C++ 交互是非常重要的,因为它允许开发人员充分利用 QML 和 C++ 各自的优势,实现更加灵活和高效的应用程序开发。

QML 是一种声明性的语言,用于构建用户界面,具有直观、简洁和易于理解的特点,适合用于描述界面的外观和交互逻辑。而 C++ 是一种强大的编程语言,可以进行复杂的计算和处理逻辑,适合用于实现底层功能和业务逻辑。

通过 QML 与 C++ 的交互,可以实现以下作用和重要性:

1.性能优化:C++ 可以处理复杂的计算和逻辑,可以提高应用程序的性能。通过将一些计算密集型的任务交给 C++ 处理,可以提高应用程序的响应速度和性能表现。

2.业务逻辑处理:C++ 可以处理底层的业务逻辑,如数据处理、文件操作、网络通信等。QML 可以专注于界面的呈现和交互逻辑,而将复杂的业务逻辑交给 C++ 处理,可以更好地分离界面和业务逻辑,提高代码的可维护性和可重用性。

3.跨平台开发:Qt 支持跨平台开发,通过 QML 与 C++ 的交互,可以实现跨平台的应用程序开发。开发人员可以在 QML 中描述界面,同时在 C++ 中处理平台相关的逻辑,从而实现跨平台的应用程序开发。

4.灵活性和可扩展性:通过 QML 与 C++ 的交互,可以实现界面与逻辑的分离,使得应用程序结构更加清晰和灵活。开发人员可以根据需求选择在 QML 中实现界面逻辑,或者在 C++ 中实现复杂的逻辑,从而实现更加灵活和可扩展的应用程序。

总的来说,QML 与 C++ 交互的作用和重要性在于充分发挥各自的优势,实现界面与逻辑的分离,提高应用程序的性能、可维护性和可扩展性,从而更好地满足复杂应用程序的开发需求。

二.pro文件添加模块

.qml模块

三.h文件

1.首先,继承自 QObject 类,是 Qt 框架中所有 QML 对象的基类。

2.其次,定义了一个 Q_PROPERTY 宏,用于在 QML 中声明此类的属性,并提供 READWRITE 和 NOTIFY 三个选项。这里定义了一个名为 name 的属性,可以在 QML 中通过 name 访问,通过 getname 函数获取属性值,通过 setName 函数设置属性值,并通过 NameChangedSig 信号通知 QML 端属性值的改变。

3.接下来,构造函数 qmlandc(),可以在此处进行一些初始化工作。

4.然后,定义了一个 setName 函数,用于在 C++ 端设置 name 属性的值,并在函数末尾通过 NameChangedSig 信号通知 QML 端属性值的改变。

5.接下来,定义了一个 getname 函数,用于在 C++ 端获取 name 属性的值。

6.最后,定义了一个 NameChangedSig 信号,用于在 C++ 端通知 QML 端 name 属性值的改变。

四.cpp文件

1.首先,构造函数 qmlandc() 将 m_name 属性初始化为字符串 "美女"。

2.然后,setName 函数用于设置 m_name 属性的值。如果传入的 name 参数与当前 m_name 属性的值相同,则直接返回,不进行任何操作。否则,将 m_name 属性的值设置为传入的 name 参数,并通过 qDebug() 函数输出当前 m_name 属性的值,最后通过 emit 关键字触发 NameChangedSig 信号。

3.最后,getname 函数用于获取 m_name 属性的值,并将其作为 QString 类型的返回值返回。

五.注册

六.调用

七.展示效果

初始值调用c++中getname显示为:美女,

点击矩形框调用c++中setname为:帅哥。

八.代码

1.qmlandc.h

#ifndef QMLANDC_H
#define QMLANDC_H

#include <QObject>
#include <QDebug>

class qmlandc : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ getname WRITE setName NOTIFY NameChangedSig)

public:
    qmlandc();

    void setName(QString name);

    QString getname();

signals:
    void NameChangedSig();

public slots:

private:
   QString m_name;
};

#endif // QMLANDC_H

2.qmlandc.cpp

#include "qmlandc.h"

qmlandc::qmlandc()
{
      m_name = "美女";
}

void qmlandc::setName(QString name)
{
    if(m_name == name){
        return ;
    }
    m_name = name ;
    qDebug()<<"aaaaaaaa"<<m_name;
    emit NameChangedSig();
}

QString qmlandc::getname()
{
    return  m_name;
}

3.main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlEngine>
#include "qmlandc.h"
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);


    //qmlRegisterType注册c++类型至qml
    //arg1:import时模块名
    //arg2:主版本号
    //arg3:次版本号
    //arg4:qml类型名
    qmlRegisterType<qmlandc>("Qmlqmlandc", 1, 0 ,"Qmlqmlandc");


    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

4.qml

import QtQuick 2.7
import Qmlqmlandc 1.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

Window {
    visible: true
    width: 400
    height: 400

    Qmlqmlandc{
        id:_Qmlqmlandc
    }

    Rectangle{
        anchors.fill: parent
        Rectangle{
            width: 50
            height: 50
            border.width: 1
            border.color: "black"
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    _Qmlqmlandc.name = "帅哥"
                }
            }
        }

        Text {
            anchors.right: parent.right
            anchors.rightMargin: 100
            font.pixelSize: 30
            text: _Qmlqmlandc.name
        }
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM运行时内存:程序计数器

文章目录 1. 程序计数器的作用2. 程序计数器的基本特征3. 程序计数器的问题 运行时内存整体结构如下图所示: 1. 程序计数器的作用 为了保证程序(在操作系统中理解为进程)能够连续地执行下去&#xff0c;CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作…

【idea】idea插件 通过文档注释生成swagger,easyexcel注解

前言&#xff1a;博主的第二个idea插件审核通过啦 (第一个插件是equals inspection) idea的plugin marketplace搜swagger excel doc即可下载安装 ​功能&#xff1a;通过文档注释生成easy Excel或swagger注解 &#xff08;快捷键altins&#xff09; ​实际场景&#xff1a;vo返…

实锤,阿里云盾会拦截百度云防护的IP!

今天凌晨&#xff0c;一位站长联系上云加速客服&#xff0c;反馈说&#xff0c;网站突然出现了502的情况。 在检查云防护子域名配置没有问题、本地强制回源没有问题的情况下&#xff0c;我们得出结论是要么服务器内防火墙拦截了云防护的IP段&#xff0c;要么服务器商拦截了云防…

Android 10.0 Launcher3定制folder文件夹2x2布局之三foldericon的2x2的布局后拖拽只能停放在右边的问题修复

1.前言 在10.0的系统rom产品定制化开发中,在对Launcher3的folder文件夹功能定制中,要求folder文件夹跨行显示,就是 2x2布局显示,默认的都是占1格的,现在要求占4格显示,系统默认是不支持显示4格的,所以接下来需要分析相关的 功能,然后来实现这个功能 2.Launcher3定制fo…

点量云流分享:关于实时渲染云推流技术

提到云串流或者云推流很多人可能和游戏关联起来&#xff0c;其实这个技术的应用领域不仅仅是游戏&#xff0c;还有云上旅游、考古、智慧园区、智慧城市、虚拟仿真等等行业。其解决的问题是将一些大型的3D应用程序放在云端&#xff0c;程序在运行的时候也是在云端&#xff0c;这…

Python学习之路 | Python基础语法(一)

数据类型 Python3 中常见的数据类型有&#xff1a; Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dict…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

颜色的表示和还原(一)

这篇文章主要提炼于ICCV 2019 Tutorial: Understanding Color and the In-Camera Image Processing Pipeline for Computer Vision。里面深入浅出地讲解了很多ISP中的基础知识&#xff0c;这里主要对颜色相关的部分做一点总结。 假设不成立了 相机经常被简单地看作是衡量光线…

Qwen学习笔记4:Qwen 7B模型调用天气API实现天气的实时查询

前言 在学习Qwen模型的函数调用功能后&#xff0c;进一步尝试利用本地的Qwen模型访问OpenWeather API来获取实时的天气情况。 参考代码来源于视频教程&#xff1a; 简单粗暴&#xff0c;轻松配置Qwen模型查询实时数据功能_哔哩哔哩_bilibili 说明 该代码运行前&#xff0c…

线性系统(二)

线性系统&#xff08;二&#xff09; 1.直观理解线性方程组结构2. 不同解的结论3. 更一般的高斯-约旦消元法4.齐次线性方程组 链接: 线性系统&#xff08;一&#xff09; 1.直观理解线性方程组结构 长这样&#xff0c;方程就有解&#xff0c;即相交坐标。 长这样&#xff0c;…

Python | Leetcode Python题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution:def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:# 设置 dummyNode 是这一类问题的一般做法dummy_node ListNode(-1)dummy_node.next headpre dummy_nodefor _ in range(left - 1):pre…

Cadence 16.6 PCB Edito如何将鼠标中键反向拉拽改为正向拖拽

Cadence 16.6 PCB Editor如何将鼠标中键反向拉拽改为正向拖拽 Cadence 16.6 PCB Editor默认鼠标中键是反向的拉拽&#xff0c;让我很不适应&#xff0c;在网上找的可行的方法&#xff0c;在这里总结出来&#xff0c;希望能帮到其他工程师。 按照以下步骤进行操作&#xff1a; …

设计模式:外观模式(Facade)

设计模式&#xff1a;外观模式&#xff08;Facade&#xff09; 设计模式&#xff1a;外观模式&#xff08;Facade&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

Golang | Leetcode Golang题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; func numDecodings(s string) int {n : len(s)// a f[i-2], b f[i-1], c f[i]a, b, c : 0, 1, 0for i : 1; i < n; i {c 0if s[i-1] ! 0 {c b}if i > 1 && s[i-2] ! 0 && ((s[i-2]-0)*10(s[i-1]-0) < 26) {c…

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal&#xff1a;S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

16.投影矩阵,最小二乘

文章目录 1. 投影矩阵1.1 投影矩阵P1.2 投影向量 1. 投影矩阵 1.1 投影矩阵P 根据上节知识&#xff0c;我们知道当我们在解 A X b AXb AXb的时候&#xff0c;发现当向量b不在矩阵A的列空间的时候&#xff0c;我们希望的是通过投影&#xff0c;将向量b投影到矩阵A的列空间中&…

机器学习—聚类算法

聚类算法 小白的机器学习笔记 2024/5/15 9:52 文章目录 聚类算法步骤K-means算法优缺点 示例 聚类算法的核心思想&#xff1a; 样本点到每个中心点的距离&#xff0c;最近的就是这个类 步骤 要聚成3类&#xff0c;先初始化3个点 第一步大致确定类别 第二步更新中心点 第三…

Vue的学习 —— <网络请求库Axios>

目录 前言 正文 一、Axios基本概念 二、安装Axios 三、Axios使用方法 四、向服务器发送请求 前言 在之前的开发案例中&#xff0c;我们通常直接在组件中定义数据。但在实际的项目开发中&#xff0c;我们需要从服务器获取数据。当其他用户希望访问我们自己编写的网页时&a…

AI绘画Midjourney 和 Stable Diffusion的区别是什么?如何使用和安装?超详细AI绘画小白零基础入门教程建议收藏!(附资料)

大家好&#xff0c;我是画画的小强 关于AI绘画&#xff0c;大家多多少少都听过Midjourney 和 Stable Diffusion的大名&#xff0c;号称目前市面上最强的两款AI绘画软件。那么今天我们就来分析一下这两款软件的区别在哪里。 Midjourney是一个在线网站&#xff0c;使用它需要用…

码农慎入 | 入坑软路由,退烧IDC,Homelab折腾记

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 俗话说&#xff0c;入门软路由&#xff0c;退坑IDC 这一期&#xff0c;我们将深入探讨一个许多科技爱好者…