qml与C++的交互

news2024/9/24 17:16:12

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

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

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

相关文章

Qt/QML编程之路:ListView实现横排图片列表的示例(40)

ListView列表,在QML中使用非常多,排列一个行,一个列或者一个表格,都会用到ListView。 ListView显示从内置QML类型(如ListModel和XmlListModel)创建的模型中的数据,或在C++中定义的从QAbstractItemModel或QAbstract ListModel继承的自定义模型类中的数据。 ListView有一…

计算机服务器中了mallox勒索病毒解密方案计划,勒索病毒解密措施

计算机技术的不断应用与发展&#xff0c;为企业的生产运营提供了有利条件&#xff0c;但网络安全威胁无处不在。近期&#xff0c;广西某生物制药企业的计算机服务器遭到了mallox勒索病毒攻击&#xff0c;导致企业的计算机所有重要数据被加密&#xff0c;严重影响企业的生产运营…

H5嵌入小程序适配方案

时间过去了两个多月&#xff0c;2024已经到来&#xff0c;又老了一岁。头发也掉了好多。在这两个月时间里都忙着写页面&#xff0c;感觉时间过去得很快。没有以前那么轻松了。也不是遇到了什么难点技术&#xff0c;而是接手了一个很烂得项目。能有多烂&#xff0c;一个页面发起…

gin中使用swagger生成接口文档

想要使用gin-swagger为你的代码自动生成接口文档&#xff0c;一般需要下面三个步骤&#xff1a; 按照swagger要求给接口代码添加声明式注释&#xff0c;具体参照声明式注释格式。使用swag工具扫描代码自动生成API接口文档数据使用gin-swagger渲染在线接口文档页面 第一步&…

IDEA远程服务器开发

IDEA的远程开发是在本地去操远程服务器上的代码&#xff0c;可以直接将本地代码的编译,构建,调试,运行等工作都放在远程服务器上而本地运行一个客户端远程去操作服务器上的代码,就如同我们平常写代码一样。相比于云桌面成本更低,开发效率更高。 1.首先服务器配置jdk&#xff0…

C# 将HTML网页、HTML字符串转换为PDF文件

将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途&#xff0c;满足不同领域和情境下的需求。本文将通过以下两个示例&#xff0c;演示如何使用第三方库Spire.PDF for .NET和QT插件在C# 中将Html 网页&#xff08;URL&#xff09;或HTML字符串转为PDF文件。 HTML转…

微服务环境搭建:docker+nacos单机

nacos需要连接mysql&#xff0c;持久化相关配置。 1. 部署好mysql后&#xff0c;新建nacos数据库然后初始化nacos脚本 -- -------------------------------------------------------- -- 主机: 192.168.150.101 -- 服务器版本: …

[Go]认识Beego框架

对比Gin的简洁&#xff0c;自己之前基于Gin撸了一个架子&#xff0c;确实比beego目录看着舒服多了&#xff0c;不过最近接触到beego的项目&#xff0c;beego的bee工具使用还是很方便&#xff0c;来简单梳理下细节&#xff1b; Beego是一个开源的Go语言Web应用框架&#xff0c;…

jenkins+gitlab实现Android自动打包填坑之旅

一.背景 1.首先你需要知道你想要实现的Android自动打包的Android项目的一些环境配置及需要使用的一些开发版本。 声明&#xff1a;本文 Android项目基于&#xff1a;1.jdk11 2.SDK无要求 3.gradle无要求&#xff08;同Manven一样为项目自动化构建开源工具&#xff09; 注&am…

【安卓版】网页转应用v1.2,生成属于你的专属应用

网页转应用可以将网址转换成可安装的APP应用。无论是新闻、博客、论坛、游戏&#xff0c;还是在线购物网站或者社交媒体平台&#xff0c;只要你有个希望转换的网址&#xff0c;这款应用都能为你实现&#xff0c;应用永久免费使用&#xff0c;并且无需联网&#xff0c;即可生成你…

【JavaWeb】会话管理 cookie session 三大域对象总结

文章目录 会话管理一、Cookie1.1 Cookie的使用1.2 Cookie的时效性1.3 Cookie的提交路径 二、Session2.1 HttpSession的使用2.2 HttpSession时效性 三、三大域对象3.1 域对象概述3.2 域对象的使用 总结 会话管理 HTTP是无状态协议 无状态就是不保存状态,即无状态协议(stateless)…

GIt同时存在传入和传出更改修改,无法合并

前言 Git是常用的版本管理工具&#xff0c;之前面试被问到过一次——Git有无遇到过使用错误情况&#xff1f;当时卡壳了没答上来&#xff0c;所以这次遇到&#xff0c;特此记录学习。 问题概述 前一天提交了代码&#xff0c;mt进行了修改。但我忘记拉取最新&#xff0c;就进…

1.19号网络

超时检测 概念 1> 在网络通信中&#xff0c;有很多函数是阻塞函数&#xff0c;会导致进程的阻塞&#xff0c;例如&#xff1a;accept、recv、recvfrom、等等 2> 为了避免进程在阻塞函数处&#xff0c;无休止的等待&#xff0c;我们可以设置一个超时时间&#xff0c;当…

【云原生】Docker的端口映射、数据卷、数据卷容器、容器互联

目录 一、端口映射&#xff08;相当于添加iptables的DANT&#xff09; 二、数据卷创建&#xff08;宿主机目录或文件挂载到容器中&#xff09; 三、数据卷容器&#xff08;多个容器通过同一个数据卷容器为基点&#xff0c;实现所有容器数据共享&#xff09; 四、容器互联&am…

尝试给docker ubuntu22.04镜像添加远程访问桌面

实在时不愿折腾&#xff0c;但是ubuntu 镜像没有桌面&#xff0c;有些操作实在太难受了&#xff0c;效率也不高。硬着头皮上吧。幸亏这是个docker的镜像。要是个虚拟机&#xff0c;这折腾来去&#xff0c;直接崩溃了。docker的好处就是立马就能从头来过&#xff0c;秒级的删除安…

Hive常见问题汇总

Hive和Hadoop的关系 Hive 构建在 Hadoop 之上&#xff0c; HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务&#xff0c;在 Hadoop 中执行&#xff08;有些查询没有 MR 任务&#xff0c;如&…

07 队列

目录 1.队列 2.实现 3.OJ题 1. 队列 只允许在一段进行插入数据操作&#xff0c;在另一端进行数据删除操作的特殊线性表&#xff0c;队列具有先进先出FIFO&#xff08;First In Firtst Out&#xff09;&#xff0c;插入操作的叫队尾&#xff0c;删除操作的叫队头 2. 实现 队列…

PWM调光 降压恒流LED芯片FP7127:为照明系统注入新能量(台灯、GBR、调光电源、汽车大灯)

目录 一、降压恒流LED芯片FP7127 二、降压恒流LED芯片FP7127具有以下特点&#xff1a; 三、降压恒流LED芯片FP7127应用领域&#xff1a; LED照明和调光的新纪元随着LED照明技术的不断发展&#xff0c;人们对于照明调光的需求也越来越高。PWM调光技术作为一种常用的调光方法&…

微软 AD 介绍 | 安全建议 | 防护

介绍&#xff1a; 什么是Active Directory&#xff08;AD&#xff09;&#xff1f; Active Directory 是由 微软开发的目录服务&#xff0c;用于存储和管理网络中的资源&#xff0c;如计算机、用户、组和其他网络对象。允许组织管理员轻松地管理和验证网络中的用户和计算机。 …

解决Sublime Text V3.2.2中文乱码问题

目录 中文乱码出现情形通过安装插件来解决乱码问题 中文乱码出现情形 打开一个中文txt文件&#xff0c;显示乱码&#xff0c;在File->Reopen With Encoding里面找不到支持简体中文正常显示的编码选项。 通过安装插件来解决乱码问题 安装Package Control插件 打开Tool->…