当前位置: 首页 > news >正文

qml调用c++类内函数的三种方法

一.方法一:使用 Q_INVOKABLE 宏声明成员函数

1.第一步:依然需要新建一个类NetworkHandler:   

#include <QObject>

class NetworkHandler : public QObject

{

    Q_OBJECT

public:

    explicit NetworkHandler(QObject *parent = nullptr);

    Q_INVOKABLE void onConnetClicked();

    Q_INVOKABLE void onTestClicked();

    Q_INVOKABLE void setValue(int newValue);

    Q_INVOKABLE int getValue();

signals:

     void valueChanged(int value);

     void kkYUy(QString str);

private slots:

    void networ_slots();

};

注意:依然需要使用 Q_INVOKABLE 这个宏声明成员函数,将函数申明为元对象系统可调用的函数,Q_INVOKABLE声明后的函数即可在qml中调用。

2.第二步:在main.cpp中进行注册:

#include <QQmlContext>

#include <QQmlEngine>

#include "network.h"

int main(int argc, char *argv[])

{

    set_qt_environment();

    QGuiApplication app(argc, argv);

    qmlRegisterType<NetworkHandler>("NetLibrary", 1, 0, "NetworkHandler");

    QQmlApplicationEngine engine;

    const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);

    QObject::connect(

        &engine,

        &QQmlApplicationEngine::objectCreated,

        &app,

        [url](QObject *obj, const QUrl &objUrl) {

            if (!obj && url == objUrl)

                QCoreApplication::exit(-1);

        },

        Qt::QueuedConnection);

    engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");

    engine.addImportPath(":/");

    engine.load(url);

    if (engine.rootObjects().isEmpty()) {

        return -1;

    }

    return app.exec();

}

注册语句:qmlRegisterType<NetworkHandler>("NetLibrary", 1, 0, "NetworkHandler");

其中NetLibrary是QML中的组件名,1.0是组件版本号,NetworkHandler是用于QML中的类名。

第三步:修改一下QML文件:

import QtQuick 6.0

import QtQuick.Controls 6.0

import NetLibrary 1.0

ApplicationWindow {

    visible: true

    width: 640

    height: 480

    title: qsTr("QML Button Example")

    Column  {

        id: buttonRow

        anchors.fill: parent

        spacing: 20

        NetworkHandler{

        id:networkClass

        }

        Button {

            id: button1

            text: qsTr("button1")

            onClicked: {

                console.log("Button clicked12!")

                networkClass.onConnetClicked()

                networkClass.setValue(1)

                button1.text = qsTr("Clicked1!")

            }

        }

    }

}

说明:

import NetLibrary 1.0 是在 main.cpp中进行注册了类型的版本化命名空间。

导入之后,就可以如下所示 调用NetworkHandler进行实例化,并设置id为networkClass:    

NetworkHandler

{

id:networkClass

}

在两个button的点击事件中,就能通过 实例化对象 networkClass调用 第一步 被 Q_INVOKABLE声明的函数了。

二.方式二:信号槽方式

1.第一步:依然需要新建一个类NetworkHandler:   

#include <QObject>

class NetworkHandler : public QObject

{

    Q_OBJECT

public:

    explicit NetworkHandler(QObject *parent = nullptr);

    Q_INVOKABLE void onConnetClicked();

    Q_INVOKABLE void onTestClicked();

    Q_INVOKABLE void setValue(int newValue);

    Q_INVOKABLE int getValue();

signals:

     void valueChanged(int value);

     void kkYUy(QString str);

private slots:

    void networ_slots();

};

注意:信号函数前不用加入Q_INVOKABLE宏

2.第二步:在main.cpp中进行注册:

#include <QQmlContext>

#include <QQmlEngine>

#include "network.h"

int main(int argc, char *argv[])

{

    set_qt_environment();

    QGuiApplication app(argc, argv);

    qmlRegisterType<NetworkHandler>("NetLibrary", 1, 0, "NetworkHandler");

    QQmlApplicationEngine engine;

    const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);

    QObject::connect(

        &engine,

        &QQmlApplicationEngine::objectCreated,

        &app,

        [url](QObject *obj, const QUrl &objUrl) {

            if (!obj && url == objUrl)

                QCoreApplication::exit(-1);

        },

        Qt::QueuedConnection);

    engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");

    engine.addImportPath(":/");

    engine.load(url);

    if (engine.rootObjects().isEmpty()) {

        return -1;

    }

    return app.exec();

}

注册语句:qmlRegisterType<NetworkHandler>("NetLibrary", 1, 0, "NetworkHandler");

其中NetLibrary是QML中的组件名,1.0是组件版本号,NetworkHandler是用于QML中的类名。

第三步:修改一下QML文件:

import QtQuick 6.0

import QtQuick.Controls 6.0

import NetLibrary 1.0

ApplicationWindow {

    visible: true

    width: 640

    height: 480

    title: qsTr("QML Button Example")

    Column  {

        id: buttonRow

        anchors.fill: parent

        spacing: 20

        NetworkHandler{

        id:networkClass

        }

        Connections{  //信号-槽连接

            target: networkClass

            function onValueChanged(value){

                console.log("/*-----------收到信号----------*/")

                console.log(value)

            }

        }

        Button {

            id: button1

            text: qsTr("button1")

            onClicked: {

                console.log("Button clicked12!")

                networkClass.onConnetClicked()

                networkClass.setValue(1)

                button1.text = qsTr("Clicked1!")

            }

        }

    }

}

说明:定义一个槽函数来接收c++中发送过来的信号

        Connections{  //信号-槽连接

            target: networkClass

            function onValueChanged(value){

                console.log("/*-----------收到信号----------*/")

                console.log(value)

            }

        }

注意:在c++类中定义的信号是  valueChanged(),在Qml中进行监听 需要在前面加 "on",首字母大写,变为onValueChanged:{}

三.方式三:通过Q_PROPERTY宏来实现

1.第一步:依然需要新建一个类MyClass:   

#include <QDebug>

#include <QObject>

class MyClass : public QObject

{

    Q_OBJECT

    Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)

public:

    MyClass(QObject *parent = nullptr) : QObject(parent), m_value(0) {}

    int getValue() const {

         qDebug()<<"MyClass--------getValue-----:"<<m_value;

        return m_value;

    }

    void setValue(int value) {

        if (m_value != value) {

            m_value = value;

            qDebug()<<"MyClass--------setValue-----:"<<m_value;

            emit valueChanged(m_value);

        }

    }

signals:

    void valueChanged(int newValue);

private:

    int m_value;

};

说明:

Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)  是 Qt 开发框架中的一个宏定义,用于在 QObject 的派生类中声明一个属性,

并为该属性提供读写接口以及属性值变化时的通知信号。

声明属性:

通过 Q_PROPERTY 宏,可以在 QObject 的派生类中声明一个名为 value 的属性。

该属性可以被 Qt 的属性系统识别和访问。

提供读写接口:

READ getValue 指定了读取 value 属性值的函数 getValue。

WRITE setValue 指定了设置 value 属性值的函数 setValue。

这两个函数分别用于获取和设置属性的值,从而实现了对属性值的封装和保护。

属性变化通知:

NOTIFY valueChanged 指定了当 value 属性值发生变化时发出的通知信号 valueChanged。

这允许其他对象或组件在属性值变化时采取相应的行动,如更新界面或触发其他逻辑。

注意:

     这种方式只能修改类的一个属性值,一般类型比较简单,就是int、QString这种;如果需要调用类的自定方法建议还是用方式一中的Q_INVOKABLE宏方式。

2.第二步:在main.cpp中进行注册:

#include "test.h"

int main(int argc, char *argv[])

{

    set_qt_environment();

    QGuiApplication app(argc, argv);

    qmlRegisterType<MyClass>("MyLibrary", 1, 0, "MyClass");

    QQmlApplicationEngine engine;

    const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);

    QObject::connect(

        &engine,

        &QQmlApplicationEngine::objectCreated,

        &app,

        [url](QObject *obj, const QUrl &objUrl) {

            if (!obj && url == objUrl)

                QCoreApplication::exit(-1);

        },

        Qt::QueuedConnection);

    engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");

    engine.addImportPath(":/");

    engine.load(url);

    if (engine.rootObjects().isEmpty()) {

        return -1;

    }

    return app.exec();

}

注册语句:qmlRegisterType<MyClass>("MyLibrary", 1, 0, "MyClass");

第三步:修改一下QML文件:

import QtQuick 6.0

import QtQuick.Controls 6.0

import MyLibrary 1.0

ApplicationWindow {

    visible: true

    width: 640

    height: 480

    title: qsTr("QML Button Example")

    Column  {

        id: buttonRow

        anchors.fill: parent

        spacing: 20

        MyClass{

        id:myClass

        }

        Button {

            id: button1

            text: qsTr("button1")

            onClicked: {

                console.log("Button clicked12!")

                console.log("myClass.value:",myClass.value)

                myClass.value=2

                button1.text = qsTr("Clicked1!")

            }

        }

    }

}

调用语句:

console.log("myClass.value:",myClass.value)  //获取value值

myClass.value=2   //设置value值

运行后log输出:

MyClass--------getValue-----: 0

qml: myClass.value: 0

MyClass--------setValue-----: 2

相关文章:

qml调用c++类内函数的三种方法

一.方法一&#xff1a;使用 Q_INVOKABLE 宏声明成员函数 1.第一步&#xff1a;依然需要新建一个类NetworkHandler: #include <QObject> class NetworkHandler : public QObject { Q_OBJECT public: explicit NetworkHandler(QObject *parent nullptr); Q_INVOKAB…...

NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)

引言&#xff1a;从TF-IDF到Prompt-Tuning&#xff08;提示词微调&#xff09;&#xff0c;NLP的四次变革 自然语言处理&#xff08;NLP&#xff09;技术从最早的手工特征设计到如今的Prompt-Tuning&#xff0c;经历了四个重要阶段。随着技术的不断发展&#xff0c;我们的目标…...

GAMES101:现代计算机图形学入门-笔记-09

久违的101图形学回归咯 今天的话题应该是比较轻松的&#xff1a;聊一聊在渲染中比较先进的topics Advanced Light Transport 首先是介绍一系列比较先进的光线传播方法&#xff0c;有无偏的如BDPT&#xff08;双向路径追踪&#xff09;&#xff0c;MLT&#xff08;梅特罗波利斯…...

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…...

MySQL聚合查询分组查询联合查询

#对应代码练习 -- 创建考试成绩表 DROP TABLE IF EXISTS exam; CREATE TABLE exam ( id bigint, name VARCHAR(20), chinese DECIMAL(3,1), math DECIMAL(3,1), english DECIMAL(3,1) ); -- 插入测试数据 INSERT INTO exam (id,name, chinese, math, engli…...

告别照相馆!使用AI证件照工具HivisionIDPhotos打造在线证件照制作软件

文章目录 前言1. 安装Docker2. 本地部署HivisionIDPhotos3. 简单使用介绍4. 公网远程访问制作照片4.1 内网穿透工具安装4.2 创建远程连接公网地址 5. 配置固定公网地址 前言 本文主要介绍如何在Linux系统使用Docker快速部署一个AI证件照工具HivisionIDPhotos&#xff0c;并结合…...

通信原理第三次实验

实验目的与内容 实验操作与结果 5.1 刚开始先不加入白噪声&#xff0c;系统设计如下&#xff1a; 正弦波参数设置如下&#xff1a; FM设计如下&#xff1a; 延迟设计如下&#xff1a; 两个滤波器设计参数如下&#xff1a; 输出信号频谱为&#xff08;未加入噪声&#xff09;&a…...

【halcon】Metrology工具系列之 get_metrology_object_result_contour

get_metrology_object_result_contour (操作员) 名称 get_metrology_object_result_contour — 查询测量对象的结果轮廓。 签名 get_metrology_object_result_contour( : Contour : MetrologyHandle, Index, Instance, Resolution : ) 描述 get_metrology_object_result_…...

A052-基于SpringBoot的酒店管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…...

NLP信息抽取大总结:三大任务(带Prompt模板)

信息抽取大总结 1.NLP的信息抽取的本质&#xff1f;2.信息抽取三大任务&#xff1f;3.开放域VS限定域4.信息抽取三大范式&#xff1f;范式一&#xff1a;基于自定义规则抽取&#xff08;2018年前&#xff09;范式二&#xff1a;基于Bert下游任务建模抽取&#xff08;2018年后&a…...

python常见问题-pycharm无法导入三方库

1.运行环境 python版本&#xff1a;Python 3.9.6 需导入的greenlet版本&#xff1a;greenlet 3.1.1 2.当前的问题 由于需要使用到greenlet三方库&#xff0c;所以进行了导入&#xff0c;以下是我个人导入时的全过程 ①首先尝试了第1种导入方式&#xff1a;使用pycharm进行…...

迅为RK3588开发板Android系统开发笔记-使用ADB工具

1 使用 ADB 工具 ADB 英文名叫 Android debug bridge &#xff0c;是 Android SDK 里面的一个工具&#xff0c;用这个工具可以操作管理 Android 模拟器或者真实的 Android 设备&#xff0c;主要的功能如下所示&#xff1a;  在 Android 设备上运行 shell 终端&#xff0c;用命…...

什么是分布式数据库?

随着现代互联网应用和大数据时代的到来&#xff0c;分布式数据库成为了解决大规模数据存储和高并发处理的核心技术之一。本文将通过深入浅出的方式&#xff0c;带你全面理解分布式数据库的概念、工作原理以及底层实现技术。无论你是刚刚接触分布式数据库的开发者&#xff0c;还…...

Leetcode 3363. Find the Maximum Number of Fruits Collected

Leetcode 3363. Find the Maximum Number of Fruits Collected 1. 解题思路2. 代码实现 题目链接&#xff1a;3363. Find the Maximum Number of Fruits Collected 1. 解题思路 这一题是一道陷阱题…… 乍一眼看过去&#xff0c;由于三人的路线完全可能重叠&#xff0c;因此…...

【数据仓库 | Data Warehouse】数据仓库的四大特性

1. 前言 数据仓库是用于支持管理和决策的数据集合&#xff0c;它汇集了来自不同数据源的历史数据&#xff0c;以便进行多维度的分析和报告。数据仓库的四大特点是&#xff1a;主题性&#xff0c;集成性&#xff0c;稳定性&#xff0c;时变性。 2. 主题性(Subject-Oriented) …...

springboot配置多数据源mysql+TDengine保姆级教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pom文件二、yamlDataSourceConfigServiceMapper.xml测试总结 前言 Mybatis-plus管理多数据源&#xff0c;数据库为mysql和TDengine。 一、pom文件 <de…...

dns实验2:反向解析

启动服务&#xff1a; 给虚拟机网卡添加IP地址&#xff1a; 查看有几个IP地址&#xff1a; 打开配置文件&#xff1a; 重启服务&#xff0c;该宽松模式&#xff0c;关闭防火墙&#xff1a; 本机测试&#xff1a; windows测试&#xff1a;&#xff08;本地shell&#xff09;...

ZooKeeper 基础知识总结

先赞后看&#xff0c;Java进阶一大半 ZooKeeper 官网这样介绍道&#xff1a;ZooKeeper 是一种集中式服务&#xff0c;用于维护配置信息、命名、提供分布式同步和提供组服务。 各位hao&#xff0c;我是南哥&#xff0c;相信对你通关面试、拿下Offer有所帮助。 ⭐⭐⭐一份南哥编写…...

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法 1. npm库xss依赖的使用方法1.1 xss库定义1.2 xss库功能 2. vue3 中 wangeditor 使用xss库解决 XSS 攻击的方法和示例2.1 在终端执行如下命令安装 xss 依赖2.2 在使用 wangeditor 的地…...

微信小程序蓝牙writeBLECharacteristicValue写入数据返回成功后,实际硬件内信息查询未存储?

问题&#xff1a;连接蓝牙后&#xff0c;调用小程序writeBLECharacteristicValue&#xff0c;返回传输数据成功&#xff0c;查询硬件响应发现没有存储进去&#xff1f; 解决&#xff1a;一直以为是这个write方法的问题&#xff0c;找了很多相关贴&#xff0c;后续进行硬件日志…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...