Qml中调用C++

2023-10-27


在qml中调用C++类步骤如下:

方法一

1. 写一个C++类

写一个类,继承自QObject。将类中需要qml调用的方法,用前置的Q_INVOKABLE声明。属性用 Q_PROPERTY注册。
代码如下:

//testsum.h
#ifndef TESTS,LMLLM,L. UM_H
#define TESTSUM_H

#include <QObject>
//继承Q_OBJECT
class TestSum : public QObject
{
    //此处要有
    Q_OBJECT
    //需要定义GetSum() SetSum()    信号SumChanged
    Q_PROPERTY(int  sum READ GetSum WRITE SetSum NOTIFY SumChanged)
public:
    explicit TestSum(QObject *parent = nullptr);

    int GetSum() const;
    void SetSum(const int & sum);
    //Q_INVOKABLE 让其在qml可以调用
    Q_INVOKABLE void SumAdd() ;

signals:
    //在sum发生改变时发送该信号
    void SumChanged(int value);
public slots:
    //此槽函数由qml处调用触发
    void sumReduce();
private:
    int m_sum;
};

#endif // TESTSUM_H



//testsum.cpp
#include "testsum.h"
#include<QDebug>
TestSum::TestSum(QObject *parent) : QObject(parent)
{
    qDebug()<<Q_FUNC_INFO<<endl;
    m_sum = 5;
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}

int TestSum::GetSum() const
{
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
    return m_sum;
}

void TestSum::SetSum(const int &sum)
{
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
    m_sum = sum;
    qDebug()<<Q_FUNC_INFO<<"send signale"<<m_sum<<endl;
    emit SumChanged(m_sum);
    qDebug()<<Q_FUNC_INFO<<"send signale============"<<m_sum<<endl;
}

void TestSum::SumAdd()
{
    qDebug()<<Q_FUNC_INFO<<endl;
    m_sum++;
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}

void TestSum::sumReduce()
{
    qDebug()<<Q_FUNC_INFO<<endl;
    m_sum--;
    qDebug()<<Q_FUNC_INFO<<m_sum<<endl;
}

2. 在需要使用的地方注册该类

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

    QGuiApplication app(argc, argv);
    //注册类 包名+版本号 ,以及使用的对象TestSum
    qmlRegisterType<TestSum>("com.test.testSum", 1, 0, "TestSum");
    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();
}

3. qml 中调用

import QtQuick 2.12
import QtQuick.Window 2.12
import com.test.testSum 1.0   // 注意此处 与步骤二中的一致(包名+版本号)
import QtQuick.Controls 1.4
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle {
        anchors.fill: parent
        width: 360;
        height: 360;
        id:r1;
        //此处将TestSum像正常qml控件一样调用。
        TestSum {
            id: ts;
            sum: 10;  //此处会调用SetSum函数
        }

        Button{
            id:b1;
            text:"Add";
            anchors.left:r1.left
            onClicked: {
                ts.sum += 1; //先调用GetSum  在调用SetSum,发送信号
            }
        }
        Button{
            id:b2;
            text:"Add";
            anchors.left:b1.left
            onClicked: {
                ts.sumReduce();
            }
        }

    }
    Connections {
        target: ts;
        onSumChanged:{
            //单击按钮,发送信号的接受端此处,由于ts.sum ,先调用GetSum.
            console.log("qml onSumChanged",ts.sum)
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qml中调用C++ 的相关文章

  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 实体框架中的重复键异常?

    我试图捕获当我将具有给定用户名的现有用户插入数据库时 引发的异常 正如标题所说 我正在使用 EF 当我尝试将用户插入数据库时 引发的唯一异常是 UpdateException 如何提取此异常以识别其是否是重复异常或其他异常 catch Up
  • C++ 有像 Pascal 一样的“with”关键字吗?

    withPascal 中的关键字可用于快速访问记录的字段 有人知道 C 是否有类似的东西吗 前任 我有一个包含许多字段的指针 但我不想这样输入 if pointer gt field1 pointer gt field2 pointer g
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • 在 MVC 类上创建主键字段

    我是 MVC 和 C 新手 我只是偶然发现它并发现它很有趣 我遇到了一个不允许我继续的问题 这是我的代码 using System using System Collections Generic using System Linq usi
  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • C++ - 模板专业化和部分专业化

    我一直在互联网和 stackoverflow 上寻找具体的答案 但我似乎找不到 我必须创建一个通用类 然后实现特定的功能 我的具体说明是 您需要使用模板表达式参数以及模板类专业化和部分专业化 我有一个模板类 template
  • 可选参数“必须是编译时常量”

    我有一个类分为两个部分文件 如下所示 public partial class PersonRepository BaseRepository
  • TestMethod:异步任务 TestSth() 不适用于 .NET 4.0

    我正在尝试使用 NET 4 0 BCL Async 和 MsTest 运行异步测试方法 看来这个设置不能处理 测试方法 异步Task测试Sth 由于测试用例资源管理器中缺少条目 将签名更改为异步后void 我可以运行测试用例 但结果错误 根
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • 使用 Microsoft Graph 创建用户

    如何使用 Microsoft graph 创建用户 因为我在保存过程中遇到了权限失败的问题 我确实有几个问题 在图中调用创建用户 API 将在哪里创建用户 是在 Azure AD 还是其他地方 我尝试通过传递 json 和必需的标头来调用创
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • .NET 的 HttpWebResponse 是否会自动解压缩 GZiped 和 Deflated 响应?

    我正在尝试执行一个接受压缩响应的请求 var request HttpWebRequest HttpWebRequest Create requestUri request Headers Add HttpRequestHeader Acc
  • C# - 命名空间内的类型声明

    在命名空间内而不是在类中声明类型的可能用途是什么 For ex namespace Test public delegate void Ispossible 这是有效的并且不会产生任何编译错误 但我无法想象为什么我们会以这种方式声明它而不是
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 统一;随机物体移动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在制作一款机器人战斗游戏 我希望敌人随机移动 然后有时会向敌人移动 我希望运动包含在其中的代码 else if avoid fal
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • 如何获取通过网络驱动器访问的文件的 UNC 路径?

    我正在 VC 中开发一个应用程序 其中网络驱动器用于访问文件 驱动器由用户手动分配 然后在应用程序中选择驱动器 这会导致驱动器并不总是映射到相同的服务器 我该如何获取此类文件的 UNC 路径 这主要是为了识别目的 这是我用来将普通路径转换为

随机推荐

  • 延时队列的几种实现方式(只有原理,并没有源码)

    延时队列 需求描述 场景一 在淘宝下了订单 过半个小时未支付就取消订单 场景二 还是淘宝 别问 问就是淘宝资深剁手党 发货后超过15天未确认就自动收货 需求分析 本质上都是超过xxx时间 就异步去做一件事 说到异步那基本上就是搞个定时任务去
  • 推荐 4 个本周 火火火火 的开源项目

    本期推荐开源项目目录 1 一个集成了主流 AI 大模型的 APP 2 模拟人类行为的小镇 3 离线 OCR 软件 4 流程图编辑框架 01 一个集成了主流 AI 大模型的 APP 该开源项目集成了主流的大语言模型 绘图模型 基于Flutte
  • 第七站:吃透JavaScript中的函数

    欢迎来到 JavaWeb的奇妙冒险 教学系列 在这里 我们将继续探索Web开发的精彩世界 本站将为你揭开JavaScript中变量的神秘面纱 让我们在学习的过程中既轻松愉快 又能掌握高质量的知识 准备好进入第七站的学习之旅了吗 让我们开始吧
  • 【C++11】右值引用和移动语义 万能引用和完美转发

    文章目录 1 右值引用和移动语义 1 1 左值引用和右值引用 1 2 右值引用的使用场景 1 3 新的类功能 2 万能引用与完美转发 2 1 万能引用的基本介绍和使用 2 2 完美转发 2 3 完美转发的实际应用场景 3 可变参数模板 3
  • C++继承(一)

    目录 继承方式 继承同名成员处理方式 父类与子类中都有相同的成员 继承同名静态成员处理方式 继承中的对象模型 继承中构造和析构函数 菱形继承 多继承语法 在多种接口需要相同输出时 C 的继承相对于传统方式更有利也更方便维护 C 继承语法 c
  • React + css3 实现circle圆环进度条加载

    需求效果图 如上图所示 需求 动态获取不同的分数 圆环展示对应的百分比分数值 正确率 70 以下提示文案 还需要继续加油哦 正确率 70 90 以下提示文案 不错 再加把劲 正确率 90 及以上提示文案 真棒 数据描述 不同的测试分数显示不
  • 如何用Git LFS管理超过50MB的文件

    首先说明 Github对文件上传尺寸有50MB的限制 如果想要上传大于50MB的文件 必须用Git Large File System进行管理 一般情况下 超额的这部分大型文件是各种包啊什么的 比如Unity项目内的一些package 本身
  • Spring IOC的实现机制

    1 什么是Spring IOC Spring IOC Inversion of Control 控制反转 是Spring框架的核心特性之一 它是一种设计模式 通过该模式 对象的创建 依赖注入和生命周期管理等操作由容器负责 而不是由程序员手动
  • Spring-cloud 导致应用收到多次ApplicationPreparedEvent

    最近排查发现DubboComponent被重复注册 怀疑ApplicationPreparedEvent收到了多次 public final class DubboConfigApplicationListener implements A
  • 华为OD机试 -配置文件恢复(C++ & Java & JS & Python)

    描述 有6条配置命令 它们执行的结果分别是 命 令 执 行 reset reset what reset board board fault board add where to add board delete no board at a
  • SPI 及 NOR Flash 介绍

    一 SPI 1 SPI的含义 SPI 串行外设设备接口 Serial Peripheral Interface 是一种高速的 全双工 同步的通信总线 SPI接口主要应用在存储芯片 AD转换器以及LCD中 SPI接口主要应用在存储芯片 AD转
  • Springboot 配置文件中用户名密码加密

    原配置文件内容 详细操作步骤 1 在pom xml文件中加依赖
  • 探究vite——新一代前端开发与构建工具(一)

    Vite 法语意为 快速的 发音 vit 是一种新型前端构建工具 能够显著提升前端开发体验 它主要由两部分组成 一个开发服务器 它基于 原生 ES 模块 提供了 丰富的内建功能 如速度快到惊人的 模块热更新 HMR 一套构建指令 它使用 R
  • 设计模式,命令模式,c++实现,提升内聚性,消除功能类与高层的耦合

    命令模式 给功能类集设置一个接口人 执行者 执行所有需求命令 避免外部 调用者 直接调用某个功能类的内部函数产生大量耦合 用于类间解耦 命令模式是一个高内聚的模式 将一个请求封装为一个对象 使用不同的请求把客户端参数化 对请求排队或者记录请
  • 深度学习中的不确定性:What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision

    转载 https zhuanlan zhihu com p 98756147 原文 What Uncertainties Do We Need in Bayesian Deep Learning for Computer Vision NI
  • VUE项目中使用this.$forceUpdate();解决页面v-for中修改item属性值后页面v-if不改变的问题

    页面展示 实现效果 点击实现列表内容的展开 折叠 代码 div class invoice list div class images img src static images invoice pu png img src static
  • SD卡通信接口 SD协议 SPI协议

    SD协议与SPI协议 SD卡虽然只有一种物理接口 但是却支持两种读写协议 SD协议和SPI协议 SPI协议特点 1 SPI协议是单片机中广泛使用的一种通信协议 并不是为SD卡专门发明的 2 SPI协议相对SD协议来说速度比较低 3 SD卡支
  • XGBoost学习(二):介绍及安装

    XGBoost学习 一 原理 XGBoost学习 二 安装及介绍 XGBoost学习 三 模型详解 XGBoost学习 四 实战 XGBoost学习 五 参数调优 XGBoost学习 六 输出特征重要性以及筛选特征 完整代码及其数据 前言
  • 如何使用ssh来连接windows

    什么是SSH协议 在计算机领域中 SSH文本传输协议 安全文件传送协议 是一种数据流连接 提供文件访问 传输和管理功能的网络传输协议 在windows上使用ssh协议因为该协议通过tcp22端口 路由器 服务器 交换机 沙sftp等不安全程
  • Qml中调用C++

    Qml中调用C 方法一 1 写一个C 类 2 在需要使用的地方注册该类 3 qml 中调用 在qml中调用C 类步骤如下 方法一 1 写一个C 类 写一个类 继承自QObject 将类中需要qml调用的方法 用前置的Q INVOKABLE声