qml与C++的交互

这篇具有很好参考价值的文章主要介绍了qml与C++的交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

qml与C++的交互,qml,c++,qml,qt

代码资源下载:
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)
        }
    }
}

qml与C++的交互,qml,c++,qml,qt

参考文章
https://blog.csdn.net/wzz953200463/article/details/129504685文章来源地址https://www.toymoban.com/news/detail-823179.html

到了这里,关于qml与C++的交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QML与C++交互

    目录 1 QML获取C++的变量值 2 QML获取C++创建的自定义对象 3 QML发送信号绑定C++端的槽 4 C++端发送信号绑定qml端槽 5 C++调用QML端函数 1 QML获取C++的变量值 全局对象 上下文属性 在qml中可全局直接使用test  2 QML获取C++创建的自定义对象 光标放在成员变量m_iValue和m_sString后面 Alt + En

    2024年02月12日
    浏览(43)
  • QML学习十三:QML与C++交互之C++端发送信号绑定QML端

    若该文为原创文章,转载请注明原文出处 本篇记录下C++端发送的信号是如何绑定QML端的,通过学习,对QML端发送信号绑定C++端有所了解,绑定的方式有三个,项目实际使用的是connect,这个也是我在项目中最常用到的。 那C++端发送的一个信号,在QML如何绑定并接收处理呢? 注

    2023年04月08日
    浏览(37)
  • 【qml-1】第一次尝试qml与c++交互

    【qml-2】尝试一个有模式的qml弹窗-CSDN博客 目的是学习qml,因为看到很多qml的酷炫效果,想试一试。 看过网上一些代码,qt提供的工具类好几个,看着就晕。只想提炼一下,做个记录。 我先整理了一套自己的想法:所谓交互,还是qt的信号槽。既然是前后端分离设计,就尽量

    2024年01月19日
    浏览(49)
  • QML 与C++交互详解

    1.思维导图 2.调用全局变量 在C++中直接定义全局变量,QML中能够直接访问。 使用engine.rootContext()-setContextProperty(\\\"WIDTH\\\",300),设置了一个全局变量WIDTH。 QML中直接访问WIDTH。  3.QML中调用C++类型 自定义一个C++类 MyObject 对象,有两个成员变量m_value和m_str,分别对应一个set和一个

    2024年02月02日
    浏览(37)
  • QML与C++交互详解

    在现代软件开发中,图形用户界面(GUI)是用户与程序交互的重要组成部分。Qt框架提供了一种强大的方式来构建跨平台的GUI应用程序,其中QML(Qt Meta-Object Language)和C++的交互是一个重要的主题。本篇博文将深入探讨如何在QML中创建和操作C++对象,实现双向的交互。 在Qt中,

    2024年01月20日
    浏览(40)
  • qml与C++的交互

    qml端使用C++对象类型、qml端调用C++函数/c++端调用qml端函数、qml端发信号-连接C++端槽函数、C++端发信号-连接qml端函数等。 代码资源下载: https://download.csdn.net/download/TianYanRen111/88779433 若无法下载,直接拷贝以下代码测试即可。 main.cpp MyObject.h MyObject.cpp TestObject.h main.qml 参考文

    2024年01月25日
    浏览(44)
  • QML与C++的交互操作

      QML旨在通过C ++代码轻松扩展。Qt QML模块中的类使QML对象能够从C ++加载和操作,QML引擎与Qt 元对象系统 集成的本质使得C ++功能可以直接从QML调用。这允许开发混合应用程序,这些应用程序是通过混合使用QML,JavaScript和C ++代码实现的。除了从QML访问C ++功能的能力之外,Qt

    2024年02月09日
    浏览(40)
  • C++与QML 信号与槽交互

    在main.cpp中通过 QQmlApplicationEngine engine 获得全局对象 在qml中使用   SCREEN_WIDTH  全局属性 1.创建一个MyObject类  2.在myobject.h中定义一些属性,以便在qml中可以使用 并为每个属性添加读写的方法和相应的信号 2.在myobject.cpp中实现 #include \\\"myobject.h\\\" MyObject::MyObject(QObject *parent) : QOb

    2024年02月16日
    浏览(42)
  • QML和C++交互中,实现C++中connect到qml的信号,再从qml发射信号传递数据给C++的一种方式

    假设我们有一个需求,要求在用户点击列表中的项目时,不仅在控制台上输出项目的名称,还要在C++端进行一些处理。我们希望在C++端能够接收到用户点击的项目名称,并进行相应的处理。 在这种情况下,我们可能会遇到一个常见的问题:如何在QML中捕获用户点击事件,并将

    2024年02月05日
    浏览(60)
  • QML、C++ 和 JS 三者之间的交互

    QML、C++ 和 JS 三者之间的交互是 Qt Quick 应用开发的核心。以下是它们之间交互的常见方式: 从 QML 调用 C++ 函数 要从 QML 调用 C++ 函数,您可以使用 Qt 的 QML 注册机制,例如 qmlRegisterType ,将 C++ 类注册为 QML 类型。 C++ 代码:

    2024年02月07日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包