QML与C++交互2

在QML与C++的交互中,主要有两种方式:在C++中调用QML的方法在QML中调用C++的方法。以下是具体的实现方法。

在C++中调用QML的方法

首先,我们需要在QML文件中定义一个函数,然后在C++代码中调用它。

示例

//QML main.qml文件
import QtQuick 2.12
import QtQuick.Window 2.12Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")Rectangle {
id: rect
width: 100
height: 100
color: "red"function changeColor(newColor) {
rect.color = newColor;
}
}
}
//c++端  main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QDebug>int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);QQmlApplicationEngine engine;
const QUrl url(QStringLiteral("qrc:/main.qml"));
engine.load(url);QObject *rootObject = engine.rootObjects().first();
QVariant returnedValue;
QVariant msg = "blue";
QMetaObject::invokeMethod(rootObject, "changeColor",
Q_RETURN_ARG(QVariant, returnedValue),
Q_ARG(QVariant, msg));return app.exec();
}

在QML中调用C++的方法

我们需要在C++类中定义一个方法,并使用Q_INVOKABLE宏标记它,然后在QML文件中调用该方法。

示例

Mclass.h

#ifndef MYCLASS_H
#define MYCLASS_H#include <QObject>class Myclass : public QObject
{Q_OBJECTQ_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)
public:Q_INVOKABLE void function1();static Myclass* getInstance();explicit Myclass(QObject *parent = nullptr);const QString &name() const;void setName(const QString &newName);int getValue() const;void setValue(int newValue);
public slots:void setspeed(int setspeed);//槽函数signals:void nameChanged();void valueChanged();private:QString m_name;int value=0;};#endif // MYCLASS_H

Myclass.cpp

#include "myclass.h"
#include "QDebug"
void Myclass::function1()
{qDebug()<<"qml端调用c++函数";
}Myclass *Myclass::getInstance()
{static Myclass* class1=new Myclass;return class1;
}Myclass::Myclass(QObject *parent) : QObject(parent)
{}const QString &Myclass::name() const
{return m_name;
}void Myclass::setName(const QString &newName)
{if (m_name == newName)return;m_name = newName;emit nameChanged();
}int Myclass::getValue() const
{return value;
}void Myclass::setValue(int newValue)
{if (value == newValue)return;value = newValue;emit valueChanged();
}void Myclass::setspeed(int setspeed)
{   this->value=setspeed;qDebug()<<"qml槽函数运行"<<setspeed;
}

 第一步就完成了,那如何通过注册好以后在qml中如何调用C++的函数?
第二步:就是将调用函数前要加入Q_INVOKABLE 宏,这样这个函数才能够在qml中调用
最后一步,通过在main.cpp中注册某个类,通过这个注册好的版本号引入对应要调用的qml文件中,然后直接通过 类.函数 调用对应的函数

main.cpp中注册类

#include <QQmlApplicationEngine>
#include<QQmlContext>
#include <QLoggingCategory>
#include "myclass.h"
#include <QIcon>
int main(int argc, char *argv[])
{QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);//初始化 Qt 应用程序。参数 argc 和 argv 用于命令行参数。//    app.setWindowIcon(QIcon("icon/icon.png"));QQmlApplicationEngine engine;//创建一个 QML 应用程序引擎实例,负责加载 QML 代码QLoggingCategory::setFilterRules(QStringLiteral("qt.qml.binding.removal.info=true"));//注册属性到 qml      不常用
//    Myclass myclass;
//    engine.rootContext()->setContextProperty("myclass", &myclass);//在qml加载之前注册c++类//qmlRegisterType注册C++类到QML//arg1:import时模块名 在qml中使用import QmlTestObject 1.0引入文件,1.0是主版本和次版本号//arg2:主版本号//arg3:次版本号//arg4:QML类型名//注册完成后去qml文件去使用qmlRegisterType<Myclass>("Myclass",1,0,"Myclass");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();

main.qml调用 

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0
import     Myclass 1.0
Window {id:rootwindowvisible: truewidth: 640;height: 480title: qsTr("Hello qt")property int myspeed:myclass.valuesignal setspeed(int set_spped)signal setqmlspeed(int set_qmlspped)Myclass{id:myclassvalue: slider.value}Button {text: "调用c++函数"onClicked: {myclass.function1()
//                            myclass.value=100;
//                            console.log( myclass.value)//value 没有改变}}
}

 

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

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

相关文章

OpenGL Chan视频学习-8 How I Deal with Shaders in OpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再整理具体函数了&#xff0c;网站直接翻译会更直观也…

动态防御新纪元:AI如何重构DDoS攻防成本格局

1. 传统高防IP的静态瓶颈与成本困境 传统高防IP依赖预定义规则库&#xff0c;面对SYN Flood、CC攻击等威胁时&#xff0c;常因规则更新滞后导致误封合法流量。例如&#xff0c;某电商平台曾因静态阈值过滤误封20%的订单接口流量&#xff0c;直接影响营收。以下代码模拟传统方案…

如何实现高性能超低延迟的RTSP或RTMP播放器

随着直播行业的快速发展&#xff0c;RTSP和RTMP协议成为了广泛使用的流媒体传输协议&#xff0c;尤其是在实时视频直播领域&#xff0c;如何构建一个高性能超低延迟的直播播放器&#xff0c;已经成为了决定直播平台成功与否的关键因素之一。作为音视频直播SDK技术老兵&#xff…

UE5 编辑器工具蓝图

文章目录 简述使用方法样例自动生成Actor&#xff0c;并根据模型的包围盒设置Actor的大小批量修改场景中Actor的属性&#xff0c;设置Actor的名字&#xff0c;设置Actor到指定的文件夹 简述 使用编辑器工具好处是可以在非运行时可以对资源或场景做一些操作&#xff0c;例如自动…

解锁5月游戏新体验 高速电脑配置推荐

很多玩家用户会发现一个规律&#xff0c;618大促前很多商家会提前解锁各种福利&#xff0c;5月选购各种电脑配件有时候会更划算&#xff01;并且&#xff0c;STEAM在5月还有几个年度主题促销&#xff0c;“生物收集游戏节”、“僵尸大战吸血鬼游戏节”等等&#xff0c;配件大促…

干货|VR全景是什么?

VR全景技术解析&#xff1a;概念、特点与用途 VR全景&#xff0c;全称为虚拟现实全景技术&#xff08;Virtual Reality Panorama Technology&#xff09;&#xff0c;是基于虚拟现实&#xff08;Virtual Reality,VR&#xff09;技术的创新展示方式。VR全景技术利用专业的拍摄设…

Nacos适配GaussDB超详细部署流程,通过二进制包、以及 Docker 打通用镜像包部署保姆级教程

1部署openGauss 官方文档下载 https://support.huaweicloud.com/download_gaussdb/index.html 社区地址 安装包下载 本文主要是以部署轻量级为主要教程,系统为openEuler,ip: 192.168.1.15 1.1系统环境准备 操作系统选择 系统AARCH64X86-64openEuler√√CentOS7√Docker…

MySQL 表内容的增删查改 -- CRUD操作,聚合函数,group by 子句

目录 1. Create 1.1 语法 1.2 单行数据 全列插入 1.3 多行数据 指定列插入 1.4 插入数据否则更新数据 1.5 替换 2. Retrieve 2.1 SELECT 列 2.1.1 全列查询 2.1.2 指定列查询 2.1.3 查询字段为表达式 2.1.4 为查询结果指定别名 2.1.5 结构去重 2.2 WHERE 条件 …

LabVIEW累加器标签通道

主要展示了 Accumulator Tag 通道的使用&#xff0c;通过三个并行运行的循环模拟不同数值的多个随机序列&#xff0c;分别以不同频率向累加器写入数值&#xff0c;右侧循环每秒读取累加器值&#xff0c;同时可切换查看每秒内每次事件的平均值&#xff0c;用于演示多线程数据交互…

【iOS】源码阅读(五)——类类的结构分析

文章目录 前言类的分析类的本质objc_class 、objc_object和NSObjectobjc_object&#xff1a;所有对象的基类型objc_class&#xff1a;类的底层结构NSObject&#xff1a;面向用户的根类 小结 指针内存偏移普通指针----值拷贝对象----指针拷贝或引用拷贝用数组指针引出----内存偏…

Baklib构建企业CMS高效协作与安全管控体系

企业CMS高效协作体系构建 基于智能工作流引擎的设计逻辑&#xff0c;现代企业内容管理系统通过预设多节点审核路径与自动化任务分配机制&#xff0c;有效串联市场、技术、法务等跨部门协作链路。系统支持多人同时编辑与版本追溯功能&#xff0c;结合细粒度权限管控模块&#x…

Linux环境变量与地址空间

哈喽&#xff0c;各位Linux初学者们&#xff01;今天咱们来聊聊Linux中那两个看起来很高大上但实际上跟我们日常使用息息相关的概念&#xff1a;环境变量和地址空间。别被这些术语吓到&#xff0c;我会用最接地气的方式给你解释清楚&#xff01; 一、环境变量&#xff1a;Linu…

Oracle SHARED POOL的SUB POOL技术

从Oracle 9i开始&#xff0c;SHARED POOL可以分为多个SUB POOL&#xff0c;其数量受以下几个因素影响&#xff1a; 系统CPU的数量。默认情况下&#xff0c;在Oracle中每4个CPU分配一个SUB POOL&#xff0c;最多不能超过7个。 共享池的大小。SUB POOL的最小容量随着Oracle版…

Collection集合遍历的三种方法

1.foreach循环遍历 格式&#xff1a;for&#xff08;元素的数据类型 变量名&#xff1a;数组或集合&#xff09;{ } 2.使用迭代器遍历 方法名称&#xff1a;Iterator<E> iterator&#xff08;&#xff09; 说明&#xff1a;返回集合中的迭代器对象&#xff0c;该迭代…

头歌之动手学人工智能-Pytorch 之autograd

目录 第1关&#xff1a;Variable 任务描述 编程要求 测试说明 没有伟大的愿望&#xff0c;就没有伟大的天才。——巴尔扎克开始你的任务吧&#xff0c;祝你成功&#xff01; 第2关&#xff1a;Variable 属性 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&a…

篇章二 数据结构——前置知识(二)

目录 1. 包装类 1.1 包装类的概念 1.2 基本数据类型和对应的包装类 1.3 装箱和拆箱 1.4 自动装箱和自动拆箱 1.5 练习 —— 面试题 2. 泛型 2.1 如果没有泛型——会出现什么情况&#xff1f; 2.2 语法 2.3 裸类型 1.没有写<> 但是没有报错为什么&#xff1f; …

Git典型使用场景相关命令

Git典型使用场景相关命令 1 建立本地仓库与远程仓库的联系2 作为开发者参与项目的常用命令2-1 一般步骤2-2 **合并与同步主分支改动**2-3 **查看日志和差异**2-4 **提交后想修改或撤销**2-5 分支管理2-6 清除未被追踪的文件&#xff08;谨慎使用&#xff09; 3 作为远程仓库管理…

redis缓存-更新策略-三大缓存问题

缓存&#xff1a;数据交换的缓冲区&#xff0c;存储的数据的临时地方&#xff0c;读写性能较高。 步骤&#xff1a; 先从redis里面查询 缓存命中&#xff1a;直接返回结果缓存未命中 从数据库里面查询 没有数据&#xff1a;返回null有数据&#xff1a;存到redis里面&#xff…

[TriCore] 01.QEMU 虚拟化 TriCore 架构中的寄存器 指令

目录 1.寄存器宏 - FIELD() 2.寄存器操作 - FIELD_SETTER() & FIELD_GETTER() 3.指令辅助方法 - HELPER() 3.1.辅助宏 3.2.指令示例 3.3.函数调用 4.PSW 寄存器读写 - psw_read() & psw_write() 1.寄存器宏 - FIELD() FIELD() 宏定义寄存器 MASK // include/hw…

《软件工程》第 4 章 - 需求获取

在软件工程中&#xff0c;需求获取是挖掘用户真实需求的关键步骤&#xff0c;它为后续的设计、开发和测试提供坚实基础。本章将围绕需求获取的流程、方法及工具展开&#xff0c;结合实际案例与 Java 代码&#xff0c;深入讲解这一重要环节。 4.1 软件需求的初始表示 4.1.1 用例…