QML学习十三:QML与C++交互之C++端发送信号绑定QML端

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

若该文为原创文章,转载请注明原文出处

本篇记录下C++端发送的信号是如何绑定QML端的,通过学习,对QML端发送信号绑定C++端有所了解,绑定的方式有三个,项目实际使用的是connect,这个也是我在项目中最常用到的。

那C++端发送的一个信号,在QML如何绑定并接收处理呢?

注:此工程延续文章使用的工程QML学习十二:QML与C++交互之QML端发送信号绑定C++端_殷忆枫的博客-CSDN博客。

C++端发送信号绑定QML端方法一

一、创建函数

在qml端创建一个函数以便访问,功能很简单,打印信号传递过来的参数。

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

 二、创建信号

在C++端创建一个cppSig信号,当QML调用这个信号时,就可以连接函数。

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

 三、信号连接

1、QML发送信号

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

 通过Connections来连接,编译运行,会打印日记,表明,发送信号有过在C++返回。

通过QML发送给C++触发信号,那边信号如何在C++端触发呢?

2、C++端发送信号

1)、修改myobject.cpp,里面有个自定义的func() 函数,在函数里增加发送信号

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

 2)、调用访问,修改main.qml,直接调用函数func()来发送C++端的信号

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

四、完整代码 

1、myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H
 
#include <QObject>
#include <QtQml>
 
 
class MyObject : public QObject
{
    Q_OBJECT
 
//    QML_ELEMENT
 
    Q_PROPERTY(int iValue READ iValue WRITE setIValue NOTIFY iValueChanged)
    Q_PROPERTY(QString sString READ sString WRITE setSString NOTIFY sStringChanged)
 
public:
    explicit MyObject(QObject *parent = nullptr);
 
    static MyObject *getInstance();
 
    Q_INVOKABLE void func();
 
    int iValue() const;
    void setIValue( int newIValue);
 
    QString sString() const;
    void setSString(const QString &newSString);
 
public slots:
    void cppSlot(int i, QString s);
 
private:
    int m_iValue;
    QString m_sString;
 
signals:
    void iValueChanged();
    void sStringChanged();

    void cppSig(QVariant i, QVariant s);
 
 
};
 
#endif // MYOBJECT_H

2、myobject.cpp

#include "myobject.h"
 
MyObject::MyObject(QObject *parent) : QObject(parent)
{
}
 
MyObject *MyObject::getInstance()
{
    static MyObject *obj = new MyObject();
 
    return obj;
}
 
int MyObject::iValue() const
{
    return m_iValue;
}
 
void MyObject::setIValue(int newIValue)
{
    if(newIValue == m_iValue)
        return ;
    m_iValue = newIValue;
    emit iValueChanged();
}
 
QString MyObject::sString() const
{
    return m_sString;
}
 
void MyObject::setSString(const QString &newSString)
{
    if(m_sString == newSString)
        return ;
    m_sString = newSString;
    emit sStringChanged();
}
 
void MyObject::cppSlot(int i, QString s)
{
    qDebug() << __FUNCTION__ << "  " << i << "  " << s;
}
 
void MyObject::func()
{
    emit cppSlot(103, "xiaoli");
    qDebug() << __FUNCTION__;
}

3、main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
 
import MyObj 1.0
 
 
Window {
    id: window
    visible: true
    width: SCREEN_WIDTH
    height: 480
    objectName: window
    title: qsTr("Hello World")
 
    signal qmlSig(int i, string s)

    function qmlSlot(i, s) {
        console.log("qml", i, s")
    }
 
    Button {
        onClicked: {
            //myobj.cppSig(99, "lisi")
            myobj.func();
        }
    }
 
    MyObject {
        id: myobj
    }
 
    Connections {
        target: myboj
        function onCppSig(i, s) {
            qmlSlot(i, s)
        }
    }
 
}
 

编译,运行后,结果都是相同的,不在展示。

直接访问C++端的函数,不通过创建myobj对像

在上面的的例子里,访问函数通过在qml端创建了一个名为myobj的对象,如果去掉,要如何访问函数?

注册qmlRegisterType<MyObject>("MyObj", 1, 0, "MyObject");使用qmlRegisterType就一定要通过创建对象来定义一个自定义的object。在项目如何每个都单独注册,那会造成程序臃肿等,QT提供了另一种方式来调用,即qmlRegisterSignletonInstance支持创建一个全局的单例模式。

比如:

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

通过上面的注册,就可以直接通过MyObject来访问。

一、完整代码

1、main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "myobject.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 
    QGuiApplication app(argc, argv);
 
    app.setOrganizationName("myApp");
 
    QQmlApplicationEngine engine;
    QQmlContext *context = engine.rootContext();
    context->setContextProperty("SCREEN_WIDTH", 800);
 
//    MyObject obj;
//    context->setContextProperty("MyObject", &obj);
 
//    context->setContextProperty("MyObject", MyObject::getInstance());
 
    qmlRegisterType<MyObject>("MyObj", 1, 0, "MyObject");

    qmlRegisterSingletonInstance("MyObj", 1, 0, "MyObject", MyObject::getInstance());
    
    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);
 
    // engine 加载完成后 load以后
    auto list = engine.rootObjects();
    auto window = list.first();
    QObject::connect(window, SIGNAL(qmlSig(int, QString)),
                     MyObject::getInstance(), SLOT(cppSlot(int, QString)));
 
    return app.exec();
}

2、main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
 
import MyObj 1.0
 
Window {
    id: window
    visible: true
    width: SCREEN_WIDTH
    height: 480
    objectName: window
    title: qsTr("Hello World")
 
    signal qmlSig(int i, string s)

    function qmlSlot(i, s) {
        console.log("qml", i, s")
    }
 
    Button {
        onClicked: {
            //myobj.cppSig(99, "lisi")
            MyObject.func();
        }
    }

    Connections {
        target: MyObject
        function onCppSig(i, s) {
            qmlSlot(i, s)
        }
    }
}
 

编译运行,结果相同,在实际项目,正常是使用单例模式来注册。

C++端发送信号绑定QML端方法二

在上面的代码中,使用的是Connections来连接,当然我们也可以使用connect来连接

如何连接,其他相当的简单:

QML学习十三:QML与C++交互之C++端发送信号绑定QML端

 

一、完整代码

1、main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "myobject.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 
    QGuiApplication app(argc, argv);
 
    app.setOrganizationName("myApp");
 
    QQmlApplicationEngine engine;
    QQmlContext *context = engine.rootContext();
    context->setContextProperty("SCREEN_WIDTH", 800);
 
//    MyObject obj;
//    context->setContextProperty("MyObject", &obj);
 
//    context->setContextProperty("MyObject", MyObject::getInstance());
 
    qmlRegisterType<MyObject>("MyObj", 1, 0, "MyObject");

    qmlRegisterSingletonInstance("MyObj", 1, 0, "MyObject", MyObject::getInstance());
    
    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);
 
    // engine 加载完成后 load以后
    auto list = engine.rootObjects();
    auto window = list.first();
    QObject::connect(window, SIGNAL(qmlSig(int, QString)),
                     MyObject::getInstance(), SLOT(cppSlot(int, QString)));

    QObject::connect(MyObject::getInstance(), SIGNAL(cppSig(int, QString)),
                     window, SLOT(qmlSlot(int, QString)));
 
    return app.exec();
}

2、main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12
 
import MyObj 1.0
 
Window {
    id: window
    visible: true
    width: SCREEN_WIDTH
    height: 480
    objectName: window
    title: qsTr("Hello World")
 
    signal qmlSig(int i, string s)

    function qmlSlot(i, s) {
        console.log("qml", i, s")
    }
 
    Button {
        onClicked: {
            //myobj.cppSig(99, "lisi")
            MyObject.func();
        }
    }

//    Connections {
//        target: MyObject
//        function onCppSig(i, s) {
//            qmlSlot(i, s)
//        }
//    }
 
}

编译测试,结果依旧相同,打印信息。

总结

1、QML调用C++端,对应的参数类型,都是QVariant.

2、项目中,使用的是单例模式。

如有侵权,请及时联系博主删除,VX:18750903063文章来源地址https://www.toymoban.com/news/detail-401429.html

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

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

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

相关文章

  • 【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)
  • 【Qt- C++ & Qml 交互】

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

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

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

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

    2024年02月07日
    浏览(35)
  • C++自定义信号和QML的槽函数建立连接

    0x00 在C++代码在定义一个信号函数:“void sendData2UI(QString msg);”,该函数主要是将接收到的UDP消息发送到QML界面中 0x01 在QML代码中使用Connections创建C++对象的信号与QML中定义的槽函数连接 效果演示:

    2024年02月16日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包