QML 与C++交互详解

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

1.思维导图

qml和c++交互,QML,c++,交互,QML

2.调用全局变量

在C++中直接定义全局变量,QML中能够直接访问。

使用engine.rootContext()->setContextProperty("WIDTH",300),设置了一个全局变量WIDTH。

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("WIDTH",300);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

QML中直接访问WIDTH。 

Window {
    id: window
    visible: true
    width: WIDTH
    height: 500
    title: qsTr("Hello World")

    Component.onCompleted: {
        console.log(window.width)
    }

    Button{
        width: 100
        height: 100
        background: {
            color:"black"
        }
    }
}

3.QML中调用C++类型

自定义一个C++类 MyObject 对象,有两个成员变量m_value和m_str,分别对应一个set和一个get方法,还有一个信号,

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>
#include <QtQml>

class MyObject : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int value READ getValue WRITE setValue NOTIFY valueChanged)
    Q_PROPERTY(QString str READ getStr WRITE setStr NOTIFY strChanged)

public:
    explicit MyObject(QObject *parent = nullptr);

public:
    void setValue(int newValue);
    int getValue();

    void setStr(QString newStr);
    QString getStr();

signals:
    void valueChanged();
    void strChanged();

private:
    int m_value;
    QString m_str;


};

#endif // MYOBJECT_H


#include "MyObject.h"

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

}

void MyObject::setValue(int newValue)
{
    if(newValue == m_value)
        return;

    m_value = newValue;
    emit valueChanged();
}

int MyObject::getValue()
{
    return m_value;
}

void MyObject::setStr(QString newStr)
{
    if(newStr == m_str)
        return;

    m_str = newStr;
    emit strChanged();
}

QString MyObject::getStr()
{
    return m_str;
}

然后在main.cpp中注册一下自定义的类,使用qmlRegisterType方法。

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

下面是在QML中调用的相关代码。

import MyObject 1.0

Window {
    id: window
    visible: true
    width: 400
    height: 500
    title: qsTr("Hello World")

    MyObject{
        value: 10
        str: "zhangsan"

        onValueChanged: {

        }

        onStrChanged: {

        }

        Component.onCompleted: {
            console.log(value,str)
        }
    }
}

下面是 Qt中属性的参考文档。

Qt 元对象和属性系统_qt元对象_Mr.codeee的博客-CSDN博客1.Qt 的元对象系统Qt 的元对象系统(Meta-Object System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。元对象系统由以下三个基础组成:QObject 类是所有使用元对象系统的类的基类。在一个类的 private 部分声明 Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。MOC(元对象编译器)为每个 QObject 的子类提供必要的代码来实现元对象系统的特性。构建项目时,MOC 工具读取 C++ 源文件,当它发现类的定义里有 Qhttps://blog.csdn.net/wzz953200463/article/details/115497012

4.QML调用C++中的方法

使用2.QML中调用C++类型中的类,增加printMsg成员方法,在前面添加Q_INVOKABLE宏,QML中就能够访问。

public:    
    Q_INVOKABLE void printMsg();

以下是在QML中访问。

Window {
    id: window
    visible: true
    width: 400
    height: 500
    title: qsTr("Hello World")

    MyObject{
        id: obj
        value: 10
        str: "zhangsan"
    }

    Button{
        width: 50
        height: 50
        background: Rectangle{
            color:"red"
        }
        onClicked: {
            obj.printMsg()
        }
    }
}

5.QML端发送信号,连接C++端槽函数

还是使用上面的类,首先在C++中增加一个槽函数,打印一些信息。

public slots:
    void slotMsg(int value,QString name);

//实现
void MyObject::slotMsg(int value,QString name)
{
    qDebug()<<__FUNCTION__<<" value = "<<value<<" name ="<<name;
}

在QML中增加一个信号signal sendMsg(int value,string name),在QML中有下面两种方式连接信号槽。

Window {
    id: window
    visible: true
    width: 400
    height: 500
    title: qsTr("Hello World")

    signal sendMsg(int value,string name)   //增加信号

    MyObject{
        id: obj
        value: 10
        str: "zhangsan"
    }

    Button{
        width: 50
        height: 50
        background: Rectangle{
            color:"red"
        }
        onClicked: {
            sendMsg(2,"zhangsan")
        }
    }

//    Connections{  //信号-槽连接方式一
//        target: window
//        function onSendMsg(i,s){
//            obj.slotMsg(i,s)
//        }
//    }

    Component.onCompleted: {    //信号-槽连接方式二
        sendMsg.connect(obj.slotMsg)
    }
}

qml和c++交互,QML,c++,交互,QML

我们也可以在C++中连接信号槽,代码如下。

首先明白一点,engine.rootObjects().first()就是QML中Window对象。

Window {
    id: window
    objectName: "window"
    visible: true
    width: 400
    height: 500
    title: qsTr("Hello World")
}
    QQmlApplicationEngine engine;
    qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    auto objs = engine.rootObjects();
    qDebug()<<objs.first()->objectName();

打印输出:

qml和c++交互,QML,c++,交互,QML

C++中连接信号-槽。

    MyObject *myobj = new MyObject();

    auto objs = engine.rootObjects();
    auto window = objs.first();
    qDebug()<<objs.first()->objectName();

    QObject::connect(window,SIGNAL(sendMsg(int,QString)),
                     myobj,SLOT(slotMsg(int,QString)));

6.C++端发送信号,连接QML端

还是使用上面的类,首先在C++中增加一个信号。

signals:
    void sigMsg(int value,QString name);

在QML中使用,增加槽函数slotMsg(),在QML中绑定信号-槽,在QML中触发信号。

Window {
    id: window
    objectName: "window"
    visible: true
    width: 400
    height: 500
    title: qsTr("Hello World")

    function slotMsg(value,name){   //增加槽函数
        console.log(value,name)
    }

    MyObject{
        id: obj
        value: 10
        str: "zhangsan"
    }

    Button{
        width: 50
        height: 50
        background: Rectangle{
            color:"red"
        }
        onClicked: {
            obj.sigMsg(2,"zhangsan") //QML中发送信号
        }
    }

    Connections{  //信号-槽连接方式一
        target: obj
        function onSigMsg(i,s){
            window.slotMsg(i,s)
        }
    }
}

C++中绑定信号-槽,在C++中触发信号。

    MyObject obj;
    QObject::connect(window,SIGNAL(sendMsg(int,QString)),
                     &obj,SLOT(slotMsg(int,QString)));

    obj.func(); //C++端触发信号

QML中的代码

Window {
    id: window
    objectName: "window"
    visible: true
    width: 400
    height: 500
    title: qsTr("Hello World")

    signal sendMsg(int value,string name)   //增加信号

    function showMsg(value,name){   //增加槽函数
        console.log("value ",value,name)
    }


    Button{
        width: 50
        height: 50
        background: Rectangle{
            color:"red"
        }
        onClicked: {
            //sendMsg(2,"zhangsan")
        }
    }

}

7.C++端调用QML端函数

在QML端声明一个函数

    function test(value,name){  //供C++端调用的函数
        console.log("test ",value,name)
    }

C++端直接调用

    QVariant ret;
    QVariant arg1 = 123;
    QVariant arg2 = "zhangsan";
    QMetaObject::invokeMethod(window,"test",Q_RETURN_ARG(QVariant,ret)
                              ,Q_ARG(QVariant,arg1)
                              ,Q_ARG(QVariant,arg2));

8.源码

相关源码文章来源地址https://www.toymoban.com/news/detail-785713.html

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

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

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

相关文章

  • 【Qt- C++ & Qml 交互】

    2024年01月10日
    浏览(65)
  • 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日
    浏览(42)
  • QML和C++交互中,实现C++中connect到qml的信号,再从qml发射信号传递数据给C++的一种方式

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

    2024年02月05日
    浏览(59)
  • QT C++类与QML交互

    C++方负责数据,QML负责显示,先准备工作如下: (1)新建一个数据类,继承至QObject class Cdata : public QObject (2)将有交互关系的数据,加入到类的私有成员中 private: int iNum; QString strEdit; (3)给此成员Q_PROPERTY和相应的函数实现(ALT+回车可自动创建) Q_PROPERTY(int iNum READ getINum W

    2024年02月04日
    浏览(42)
  • QML与C++的交互操作

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

    2024年02月09日
    浏览(39)
  • 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)
  • Qt开发教程:C++与QML的交互

    Qt是一个功能强大的跨平台应用程序开发框架,支持同时使用C++和QML来开发应用程序。通过C++与QML的交互,我们可以实现更灵活、更强大的应用程序。本文将详细介绍如何在Qt中创建自定义对象、在QML端发送信号并绑定到C++端、在C++端发送信号并绑定到QML端、以及实现QML端直接

    2024年04月16日
    浏览(58)
  • QML、C++ 和 JS 三者之间的交互

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

    2024年02月07日
    浏览(34)
  • 在Qt中实现C++与QML的交互

    Qt是一个功能强大的跨平台应用程序开发框架,支持同时使用C++和QML来开发应用程序。通过C++与QML的交互,我们可以实现更灵活、更强大的应用程序。本文将详细介绍如何在Qt中创建自定义对象、在QML端发送信号并绑定到C++端、在C++端发送信号并绑定到QML端、以及实现QML端直接

    2024年02月09日
    浏览(40)
  • qt笔记之qml和C++的交互系列(一):初记

    code review! —— 杭州 2023-11-16 夜 参考资料: 官方文档《Exposing Attributes of C++ Types to QML》(将C++类暴露给QML) 官方文档《Data Type Conversion Between QML and C++》 官方文档《The Property System》 官方文档《Defining QML Types from C++》(在QML中定义C++类) 官方文档《Overview - QML and C++ Integration》 1.

    2024年02月04日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包