qml与C++的交互

qml端使用C++对象类型、qml端调用C++函数/c++端调用qml端函数、qml端发信号-连接C++端槽函数、C++端发信号-连接qml端函数等。

在这里插入图片描述

代码资源下载:
https://download.csdn.net/download/TianYanRen111/88779433
若无法下载,直接拷贝以下代码测试即可。

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "MyObject.h"
#include "TestObject.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    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);


    qmlRegisterType<MyObject>("com.mycompany.qmlcomponents", 1, 0, "MyObject");
    qmlRegisterType<TestObject>("com.mycompany.qmlcomponents", 1, 0, "TestObject");

    engine.load(url);

    //
    auto objs = engine.rootObjects();
    auto window = objs.first();

    // c++ 绑定信号槽,C++端发信号
    // 此种形式必须将信号设置为 QVariant类型
    MyObject obj;
    QObject::connect(&obj, SIGNAL(sendCpp2(QVariant, QVariant)), window, SLOT(slotCpp(QVariant, QVariant)));
    obj.test2(); // 发送信号

    // c++端调用qml端函数
    qDebug()<<objs.first()->objectName();
    QVariant ret;
    QVariant arg1 = 123333;
    QVariant arg2 = "zhangsan===";
    QMetaObject::invokeMethod(window, "qmlFunc", Q_RETURN_ARG(QVariant, ret)
                              ,Q_ARG(QVariant, arg1)
                              ,Q_ARG(QVariant, arg2));

    return app.exec();
}

MyObject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include <QDebug>

class MyObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int num READ num WRITE setNum NOTIFY numChanged)
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

public:
    explicit MyObject(QObject *parent = nullptr);    
    int num() const;
    QString name() const;

    Q_INVOKABLE void printMessage();
    Q_INVOKABLE void test1() {
        emit sendCpp1("--------------111111-------");
    }
    void test2() {
        emit sendCpp2("---------2222222222------------series", 222222222222);
    }

public slots:
    void setNum(int num);
    void setName(QString name);

    void onMsg(QString msg, int value);

signals:
    void numChanged(int num);
    void nameChanged(QString name);

    void sendCpp1(QString message);
    void sendCpp2(QVariant message, QVariant value);

private:
    int m_num;
    QString m_name;
};

#endif // MYOBJECT_H

MyObject.cpp

#include "MyObject.h"

MyObject::MyObject(QObject *parent) : QObject(parent)
{

}

int MyObject::num() const
{
    return m_num;
}

QString MyObject::name() const
{
    return m_name;
}

void MyObject::printMessage()
{
    qDebug() << "@@@@@@@@@@@@@@@ message is:> 11111111111";
}

void MyObject::setNum(int num)
{
    if (m_num == num)
        return;

    m_num = num;
    emit numChanged(m_num);
}

void MyObject::setName(QString name)
{
    if (m_name == name)
        return;

    m_name = name;
    emit nameChanged(m_name);
}

void MyObject::onMsg(QString msg, int value)
{
    qDebug() << "################> msg:value is:> " << msg << value;
}

TestObject.h

#ifndef TESTOBJECT_H
#define TESTOBJECT_H

#include <QObject>

class TestObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString message READ message WRITE setMessage NOTIFY messageChanged)

public:
    explicit TestObject(QObject *parent = nullptr);
    QString message() const {
        return m_message;
    }

public slots:
    void setMessage(QString message) {
        {
            if (m_message == message)
                return;

            m_message = message;
            emit messageChanged(m_message);
        }

    }

signals:
    void messageChanged(QString message);

private:
    QString m_messsage;
    QString m_message;
};

#endif // TESTOBJECT_H

main.qml

import QtQuick 2.0
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
import QtQuick.Layouts 1.3
import QtQml 2.12
import com.mycompany.qmlcomponents 1.0

Window {
    id: window
    objectName: "myWindow"
    visible: true
    width: 600
    height: 250
    title: qsTr("Hello World")

    signal sendMsg(string msg, int value)

    function slotCpp(message, value) {
        console.log(">>>... " + message + " " + value)
    }

    function qmlFunc(msg, value) {
        console.log("......qml function... msg:value:> ", msg, value)
    }

    MyObject {
        id: myObject
        num: 101
        name: "zhangSan"

        onNumChanged: {
            console.log("...new num is:> ", num)
        }

        onNameChanged: {
            console.log("...new name is:> ", name)
        }

        Component.onCompleted: {
            console.log("...init num and name is:> " + num + " " + name)
        }
    }

    TestObject {
        id: testObject
        message: "HelloWorld..."

        onMessageChanged: {
            console.log("...new message is:> ", message)
        }

        Component.onCompleted: {
            console.log("...init message is:>" + message)
        }
    }

    Column {
        spacing: 10

        Button {
            text: "qml中测试c++对象类型"
            onClicked: {
                myObject.num = 102
                myObject.name = "wang"
                testObject.message = "HelloWorld, I love you..."
            }
        }
        Button {
            text: "qml端调用C++端函数"
            onClicked: {
                myObject.printMessage()
            }
        }
        Button {
            text: "qml端发送信号, 连接C++端槽函数"
            onClicked: {
                sendMsg("...qml signal", 66666666)
            }
        }
        Button {
            text: "C++端发送信号, 连接qml端槽函数"
            onClicked: {
                myObject.test1()
            }
        }
    }

    // qml信号连接C++槽函数:方式一
    //    Connections {
    //        target: window
    //        onSendMsg: {
    //            myObject.onMsg("...qml signal", 8888888)
    //        }
    //    }

    //qml信号连接C++槽函数:方式二
    Component.onCompleted: {
        window.sendMsg.connect(myObject.onMsg)
    }

    Connections {
        target: myObject
        onSendCpp1: {
            console.log("......======" + message)
        }
    }
}

请添加图片描述

参考文章
https://blog.csdn.net/wzz953200463/article/details/129504685

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HDMI之ALLM

概述 ALLM(Auto Low-latency Mode)即自动低延迟模式,在自动低延迟模式下智能电视的用户不用根据电视播放的内容手动来切换低延迟模式,而会根据电视播放的内容自动启用或者禁用低延迟模式。这里的启用或者禁用低延迟功能通常是信号源设备控制的(如游戏设备 Xbox One,或 PS5…

LIMS源码,实验室信息系统源码,后端框架:asp.net

LIMS(laboratory information management system)即实验室信息管理系统是实验室管理科学发展的成果&#xff0c;是实验室管理科学与现代信息技术结合的产物&#xff0c;是利用计算机网络技术、数据存储技术、快速数据处理技术等&#xff0c;对实验室进行全方位管理的计算机软件…

66.Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

原理 首先MyBatis的Mapper接口核心是JDK动态代理 Spring会排除接口&#xff0c;无法注册到IOC容器中 MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition 需要自定义扫描器&#xff08;继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重…

微信小程序如何自定义单选和多选

实现单选 实现效果&#xff1a;点击显示单选状态&#xff0c;每次仅能点击一个元素。 实现方式&#xff1a; wxml&#xff1a; <view wx:for"{{item_list}}" data-info"{{index}}" class"{{menu_indexindex?choose:no_choose}}" bind:ta…

【Linux】shell外壳和权限

文章目录 shell外壳用户切换权限 shell外壳 什么是shell外壳呢&#xff1f;首先我们应该知道&#xff0c;用户和操作系统内核是不能直接接触的&#xff0c;因为首先操作系统本身就很难去操作&#xff0c;另一方面也是为了操作系统安全考虑&#xff0c;不能让用户直接去操作内核…

Matlab图像处理——谷物颗粒计数

针对目前谷物人工计数和光电计数方法存在的不足 , 提出了一种基于 Matlab 图像识别和处理技术的谷物计数方法 , 并用实例验证了其可靠性。该方法减轻了操作者劳动强度 , 弥补了人视觉的不足之处 , 提高了效率及准确率 , 为今后进一步研究奠定了必要的理论与实践基础 , 对完善“…

有趣的数学 了解TensorFlow的自动微分的实现

一、简述 这里主要介绍了TensorFlow的自动微分(autodiff)功能如何工作,以及与其他解决方案的比较。假设您定义了一个函数,并且需要计算它的偏导数和,通常用于执行梯度下降(或某些其他优化算法)。可用的主要选择是手动微分、有限差分近似、正向模式自动微分和反向模式自动…

uniapp微信小程序图片上传功能实现,页面显示文件列表、删除功能

uniapp小程序图片上传功能效果预览 一、template 页面结构 <view class"upload-box"><view class"upload-list"><view class"upload-item" v-for"(item,index) of fileList" :keyindex><image class"img…

SMD NTC Thermistor NTC热敏电阻在锂电池充放电中的作用(NYFEA徕飞)

热敏电阻器&#xff08;Thermistor&#xff09;是一种电阻值对温度极为灵敏的半导体元件&#xff0c;温度系数可分为正温度系数热敏电阻PTC和负温度系数热敏电阻NTC。 NTC热敏电阻用于温度测量&#xff0c;温度控制&#xff0c;温度补偿等&#xff0c;称为温度传感器。 PTC热…

【python】—— 文件操作

目录 &#xff08;一&#xff09;文件是什么 &#xff08;二&#xff09;文件路径 &#xff08;三&#xff09;文件操作 3.1 打开文件 3.2 关闭文件 3.3 写文件 3.4 读文件 &#xff08;四&#xff09;关于中文的处理 &#xff08;五&#xff09;使用上下文管理器 &…

打印机怎么连接到电脑?完整指南助你顺利连接

随着科技的不断发展&#xff0c;打印机作为一种常见的办公设备&#xff0c;已经成为我们日常工作不可或缺的一部分。可是打印机怎么连接到电脑呢&#xff1f;本文将介绍三种常见的方法&#xff0c;详细解释如何将打印机连接到电脑&#xff0c;以便用户在面对这一操作时能够迅速…

【软件测试】学习笔记-Nginx 在系统架构中的作用

本篇文章你探讨 Nginx 在应用架构中的作用&#xff0c;并从性能测试角度看如何利用 Nginx 数据统计用户访问量。 Nginx 重要的两个概念 代理 首先要来解释一下什么是代理&#xff0c;正向代理和反向代理是什么意思&#xff1f;各自作用是什么&#xff1f;不少同学经常听到这…

[BSidesCF 2020]Had a bad day

先看url&#xff0c;发现可能有注入 http://655c742e-b427-485c-9e15-20a1e7ef1717.node5.buuoj.cn:81/index.php?categorywoofers 试试能不能查看index.php直接?categoryindex.php不行&#xff0c;试试伪协议 把.php去掉试试 base64解码 <?php$file $_GET[category];…

多域名SSL证书免费申请

在互联网信息安全日益受到重视的今天&#xff0c;SSL证书已经成为了网站安全的重要组成部分。那么&#xff0c;什么是SSL证书呢&#xff1f;简单来说&#xff0c;SSL证书是一种用于保证网络传输过程中数据安全的认证机制&#xff0c;它可以确保网站和用户之间的数据传输是加密的…

OpenCV读取摄像头窗口变大且很卡的解决方法

视频讲解 OpenCV读取摄像头窗口变大且很卡的解决方法 测试过程 读取摄像头窗口变大且很卡的代码 import cv2 cap cv2.VideoCapture(0) if not cap.isOpened():print("Cannot open camera")exit() while True:ret, frame cap.read()if not ret:print("no str…

TCP 异常断开连接【重点】

参考链接 https://xiaolincoding.com/network/3_tcp/tcp_down_and_crash.html https://xiaolincoding.com/network/3_tcp/tcp_unplug_the_network_cable.html#%E6%8B%94%E6%8E%89%E7%BD%91%E7%BA%BF%E5%90%8E-%E6%9C%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93 关键词&#xff1a…

用的到的linux-Day1

前言&#xff1a; 从入门IT开始我们知道Linux操作系统与其他操作系统不同&#xff0c;Linux因为其独特的优势&#xff0c;被广泛应用在服务器领域&#xff0c;而且是一个近乎完美的操作系统&#xff0c;运行稳定、功能强大、安全性高、开源、可定制等等。 因此我打算从24年开始…

操作无法完成,因为文件已在Windows资源管理器中打开,如何解决?以及如何将哔哩哔哩下载好的视频导出到电脑中播放?— 以vivo手机为例

前言 想删除流氓软件的时候&#xff0c;提示操作无法完成&#xff0c;因为文件已在Windows资源管理器中打开&#xff0c;但打开任务管理器&#xff0c;似乎又没有符合的正在执行的程序&#xff0c;更别说打开让人看到头疼的资源监视器了&#xff0c;本文将用一招解决如上问题 …

收单外包服务机构备案分析(2020-2023年度)

孟凡富 为加强收单业务外包服务市场规范管理&#xff0c;保护市场参与主体和消费者合法权益&#xff0c;促进收单业务健康发展&#xff0c;中国支付清算协会根据《银行卡收单业务管理办法》&#xff08;中国人民银行公告〔2013〕第9号公布&#xff09;、《中国人民银行关于加强…