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 没有改变}}
}
相关文章:
QML与C++交互2
在QML与C的交互中,主要有两种方式:在C中调用QML的方法和在QML中调用C的方法。以下是具体的实现方法。 在C中调用QML的方法 首先,我们需要在QML文件中定义一个函数,然后在C代码中调用它。 示例 //QML main.qml文件 import QtQu…...

EtherNet/IP机柜内解决方案在医疗控制中心智能化的应用潜能和方向分析
引言 在数智化转型浪潮席卷各行各业的今天,医疗领域同样面临着提升运营效率、改善患者体验和加强系统可靠性的多重挑战。Rockwell Automation于2025年5月20日推出的EtherNet/IP机柜内解决方案,为医疗中心的自动化升级提供了一种创新路径。本报告将深入分析这一解决方案的核心…...
springboot中各模块间实现bean之间互相调用(service以及自定义的bean)
springboot中各模块间实现bean之间互相调用(service以及自定义的bean) https://blog.csdn.net/qq_29477175/article/details/122827446?ops_request_misc&request_id&biz_id102&utm_termspringboot%E5%A4%9A%E6%A8%A1%E5%9D%97%E4%B9%8B%E…...
RabbitMQ 可靠性保障:消息确认与持久化机制(二)
四、持久化机制:数据安全的护盾 (一)交换机持久化 交换机持久化是确保消息路由稳定的重要保障 。在 RabbitMQ 中,交换机负责接收生产者发送的消息,并根据路由规则将消息路由到相应的队列 。如果交换机在 RabbitMQ 重…...
QML学习07Property
Property 1、Property1.1 定义控件1.2 给控件取别名,不向外暴露控件名字 2、总结 1、Property property int myTopMargin: 0 property int myBottomMargin: 0 property real myReal: 0.0 //双精度浮点数 property string myString: "test" property…...
Skywalking安装部署使用教程
目录 核心功能 架构设计 安装与配置 使用场景 社区与支持 总结 官网 https:///apache/skywalking 部署Skywalking 添加报警配置 自定义告警规则如果您需要自定义告警规则,则需要编辑 alarm-settings.yml 文件并添加自定义的规则。具体来说,您需要按照 YAML 格式定义…...
网络编程与axios技术
网络编程技术是指通过计算机网络实现不同设备之间数据交互的技术。它基于网络通信协议(如TCP/IP、HTTP)和编程语言的支持,结合库和API实现高效的数据传输与通信。以下是几种主流技术栈(JavaScript、TypeScript、React、Next.js、P…...

【结构设计】以3D打印举例——持续更新
【结构设计】以立创EDA举例——持续更新 文章目录 [TOC](文章目录) 前言立创EDA官网教程一、3D外壳绘制二、3D外壳渲染三、3D外壳打印1.3D打印机——FDM2.3D打印机——光固化 四、3D外壳LOG设计1.激光雕刻机 总结 前言 提示:以下是本篇文章正文内容,下面…...

MySQL中的重要常见知识点(入门到入土!)
基础篇 基础语法 添加数据 -- 完整语法 INSERT INTO 表名 (字段名1, 字段名2, ...) VALUES (值1, 值2, ...);-- 示例 insert into employee(id,workno,name,gender,age,idcard,entrydate) values(1,1,Itcast,男,10,123456789012345678,2000-01-01) 修改数据 -- 完整语法 UPDA…...

理解全景图像拼接
1 3D到2D透视投影 三维空间上点 p 投影到二维空间 q 有两种方式:1)正交投影,2)透视投影。 正交投影直接舍去 z 轴信息,该模型仅在远心镜头上是合理的,或者对于物体深度远小于其到摄像机距离时的近似模型。…...

云原生安全基石:Linux进程隔离技术详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 进程隔离是操作系统通过内核机制将不同进程的运行环境和资源访问范围隔离开的技术。其核心目标在于: 资源独占:确保…...

基于PySide6与pycatia的CATIA几何阵列生成器开发实践
引言:参数化设计的工业价值 在航空航天、汽车制造等领域,复杂几何图案的批量生成是模具设计与机械加工的核心需求。传统手动建模方式存在效率低下、参数调整困难等问题。本文基于PySide6+pycatia技术栈,实现了一套支持动态参数配置、智能几何阵列生成的自动…...

Linux学习心得问题总结(三)
day09 文件权限篇 文件权限的属性有哪些?我们应如何理解这些属性? 文件权限的属性包括可读(r)、可写(w)、可执行(x)三种权限,根据文件类型可分为普通文件(.…...
蓝桥杯国14 不完整的算式
!!!!!!!!!!!!!!!理清思路 然后一步步写 问题描述 小蓝在黑板上写了一个形如 AopBC 的算式&#x…...

Anthropic推出Claude Code SDK,强化AI助理与自动化开发整合
Anthropic发布Claude Code SDK,协助开发团队将人工智慧助理整合进自动化开发流程,支援多轮对话、MCP协定及多元格式。 Anthropic推出Claude Code SDK,提供开发者与企业一套可程序化整合Claude AI助理至开发流程的工具。此SDK以命令列介面为基…...

6.4.1最小生成树
知识总览 生成树(一定是连通的): 是连通的无向图的一个子图,子图包含这个无向图的所有顶点有n-1条边(少一条边,生成树就不连通了)即为生成树,一个连通图可能有多个生成树 最小生成树(最小代价树): 只有连通的无向图才…...
DAY 33
知识点回顾: 1. PyTorch和cuda的安装 2. 查看显卡信息的命令行命令(cmd中使用) 3. cuda的检查 4. 简单神经网络的流程 a. 数据预处理(归一化、转换成张量) b. 模型的定义 i. 继承nn.Module类 ii. 定义…...
基于ICEEMDAN-SSA-BP的混合预测模型的完整实现过程
以下将为您详细阐述基于ICEEMDAN-SSA-BP的混合预测模型的完整实现过程,包含原理说明、算法实现、代码解析及优化策略。本教程分为六个核心部分,采用Python 3.9环境开发。 基于ICEEMDAN-SSA-BP的混合时间序列预测模型 一、模型架构设计 1.1 整体流程 #mermaid-svg-o4UD3HaTm…...
常见排序算法详解及其复杂度分析
常见排序算法详解及其复杂度分析 排序算法是数据结构与算法学习中的基础内容,也是面试高频考点。本文将系统介绍几种常见的排序算法,包括它们的原理、时间复杂度、空间复杂度以及 Python 实现方法。 一、冒泡排序(Bubble Sort) …...

DARLR用于具有动态奖励的推荐系统的双智能体离线强化学习(论文大白话)
1. 概述 离线强化学习是现在强化学习研究的一个重点。相比与传统的强化学习它不需要大量的实时交互数据,仅仅依赖历史交互日志就可以进行学习。本文就是将离线强化学习用于推荐系统的一篇文章。 这篇文章主要解决的核心问题有以下几个: 1)…...

第35节:PyTorch与TensorFlow框架对比分析
引言 在深度学习领域,PyTorch和TensorFlow无疑是当前最受欢迎的两大开源框架。 自2015年TensorFlow由Google Brain团队发布,以及2016年Facebook的AI研究团队推出PyTorch以来,这两个框架一直在推动着深度学习研究和工业应用的发展。 本文将从多个维度对这两个框架进行详细对…...

企业级智能体 —— 企业 AI 发展的下一个风口?
在AI技术迅猛发展的当下,企业对AI的应用不断深入。企业级智能体逐渐受到关注,它会是企业AI发展的下一个风口吗?先来看企业典型的AI应用场景,再深入了解企业级智能体。 企业典型AI应用场景 1. 内容生成:2025年…...

【软考向】Chapter 2 程序设计语言基础知识
程序设计语言概述低级语言 —— 机器指令、汇编语言高级语言 ——翻译:汇编、解释和编译语言处理程序基础 —— 翻译给计算机,汇编、编译、解释三类编译程序基本原理 —— 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成文法和语言的形式描述确定的有限…...

JavaWeb:SpringBootAOP切面实现统计方法耗时和源码解析
介绍 快速入门 1.导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2.切面类java Slf4j Aspect Component public class RecordTimeApsect {/*** 统计耗…...

RabbitMQ的其中工作模式介绍以及Java的实现
文章目录 前文一、模式介绍1. 简单模式2. 工作队列模式3. 广播模式4. 路由模式5. 通配符模式6. RPC模式7. 发布确认模式 二、代码实现1、简单模式2、工作队列模式生产者消费者消费者 1消费者 2 3、广播模式 (Fanout Mode)生产者消费者 4、路由模式 (Direct Mode)生产者消费者 5…...

vue2项目搭建
作者碎碎念:开历史倒车了,没想到不兼容,只能从vue3->vue2了。 1 vue3和vue2 这部分参考了官网的《vue3迁移指南》:Vue 3 的支持库进行了重大更新。以下是新的默认建议的摘要: 新版本的 Router, Devtools & test utils 来…...

Spring AI 源码解析:Tool Calling链路调用流程及示例
Tool工具允许模型与一组API或工具进行交互,增强模型功能,主要用于: 信息检索:从外部数据源检索信息,如数据库、Web服务、文件系统或Web搜索引擎等 采取行动:可用于在软件系统中执行特定操作,如…...

2025年- H48-Lc156 --236. 二叉树的最近公共祖先(递归、深搜)--Java版
1.题目描述 递归终止条件: 如果当前节点 root 为 null,表示到达了叶子节点的空子树; 如果当前节点是 p 或 q,就返回它(因为从这里可以回溯寻找公共祖先)。 2.思路 (1) 如果当前节…...
【人工智能】低代码-模版引擎
模板引擎是一种将数据与静态模板结合,生成动态内容的工具。它的核心作用是将业务逻辑与展示层分离,使代码更易维护、复用和管理。 核心功能 变量替换:将模板中的占位符替换为动态数据。 逻辑控制:支持条件判断(if/els…...

Hertz+Kitex快速上手开发
本篇文章以用户注册接口为例,快速上手HertzKitex 以用户注册接口来演示hertz结合kitex实现网关微服务架构的最简易版本 项目结构 api- gateway:网关实现,这里采用hertz框架 idl:接口定义用来生成kitex代码 kitex_genÿ…...