QML与C++交互

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

目录

1 QML获取C++的变量值

2 QML获取C++创建的自定义对象

3 QML发送信号绑定C++端的槽

4 C++端发送信号绑定qml端槽

5 C++调用QML端函数


1 QML获取C++的变量值
QQmlApplicationEngine engine;

全局对象

上下文属性

QQmlApplicationEngine engine;
QQmlContext *context1 = engine.rootContext();
context1->setContextProperty("test",200);

在qml中可全局直接使用test 

2 QML获取C++创建的自定义对象

光标放在成员变量m_iValue和m_sString后面 Alt + Enter 选择第一个可自动生成函数

int m_iValue;
QString m_sString;

myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>

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

    int iValue() const;
    void setIValue(int newIValue);

    const QString &sString() const;
    void setSString(const QString &newSString);

signals:
    void iValueChanged();

    void sStringChanged();

private:
    int m_iValue;
    QString m_sString;

    Q_PROPERTY(int iValue READ iValue WRITE setIValue NOTIFY iValueChanged)
    Q_PROPERTY(QString sString READ sString WRITE setSString NOTIFY sStringChanged)
};

#endif // MYOBJECT_H

myobject.c

#include "myobject.h"

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

}

int MyObject::iValue() const
{
    return m_iValue;
}

void MyObject::setIValue(int newIValue)
{
    if (m_iValue == newIValue)
        return;
    m_iValue = newIValue;
    emit iValueChanged();
}

const QString &MyObject::sString() const
{
    return m_sString;
}

void MyObject::setSString(const QString &newSString)
{
    if (m_sString == newSString)
        return;
    m_sString = newSString;
    emit sStringChanged();
}

mian.c

注册main.qml 中 import testObj 1.0使用

qmlRegisterType<MyObject>("testObj",1,0,"MyObject");

main.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.5
import testObj 1.0
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    MyObject {
        iValue: 20
        sString: "test"

    }


}

使用c++端的函数时需要在函数前面加上 Q_INVOKABLE

比如 Q_INVOKABLE void myFunction();

3 QML发送信号绑定C++端的槽

在mian.c先注册 qmlRegisterType<MyObject>("testObj",1,0,"MyObject");

C++ 写一个公有槽 

public slots:
    void qml_slot(QString str);

qml端通过按钮发送信号

signal qml_signal(string str)
    Button {
        onClicked: {
            qml_signal("qml send signal test");
        }
    }

绑定信号和槽函数

Component.onCompleted: {
        qml_signal.connect(myobj.qml_slot)
    }

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.5
import testObj 1.0
Window {
    id: window
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    MyObject {
        id: myobj
        iValue: 20
        sString: "test"

    }
    
    signal qml_signal(string str)
    Button {
        onClicked: {
            qml_signal("qml send signal test");
        }
    }
    //方法一
//    Connections {
//        target: window
//        function onQml_signal(str){
//            myobj.qml_slot(str)
//        }
//    }
    //方法二
    Component.onCompleted: {
        qml_signal.connect(myobj.qml_slot)
    }

    //方法三 mian.c 中engine load后
    //auto obj_list = engine.rootObjects();
    //auto window = list.first();
    //connect(window,SIGNAL(qml_signal(QString)),your function ptr,SLOT(qml_slot(QString)));

}
4 C++端发送信号绑定qml端槽

myobject.h

信号 void signal_Cpp(QString str); 通过函数

Q_INVOKABLE void myFunction();发送
#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QObject>

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

    int iValue() const;
    void setIValue(int newIValue);

    const QString &sString() const;
    void setSString(const QString &newSString);

    Q_INVOKABLE void myFunction();

    static MyObject* getInstance();
public slots:
    void qml_slot(QString str);
signals:
    void iValueChanged();

    void sStringChanged();

    void signal_Cpp(QString str);
private:
    int m_iValue;
    QString m_sString;

    Q_PROPERTY(int iValue READ iValue WRITE setIValue NOTIFY iValueChanged)
    Q_PROPERTY(QString sString READ sString WRITE setSString NOTIFY sStringChanged)
};

#endif // MYOBJECT_H

myobject.c

#include "myobject.h"
#include <QDebug>
MyObject::MyObject(QObject *parent)
    : QObject{parent}
{

}

int MyObject::iValue() const
{
    return m_iValue;
}

void MyObject::setIValue(int newIValue)
{
    if (m_iValue == newIValue)
        return;
    m_iValue = newIValue;
    emit iValueChanged();
}

const 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::myFunction()
{
    emit signal_Cpp("signal_Cpp myFunction!");
}

MyObject *MyObject::getInstance()
{
    static MyObject* obj = new MyObject();
    return obj;
}

void MyObject::qml_slot(QString str)
{
    qDebug()<<"qml_slot"<<str;
}

mian.c

注册单例类

qmlRegisterSingletonInstance("testObj",1,0,"MyObject",MyObject::getInstance());
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtQml/qqml.h>
#include "myobject.h"

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlContext *context1 = engine.rootContext();
    context1->setContextProperty("test",200);
    //qmlRegisterType<MyObject>("testObj",1,0,"MyObject");
    
    qmlRegisterSingletonInstance("testObj",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);

    return app.exec();
}

main.qml

C++端发送信号

Button {
        onClicked: {
            //C++发送信号
            MyObject.myFunction()
        }
    }

连接QML端槽函数

Connections {
        target: MyObject
        function onSignal_Cpp(str) {
            //qml槽函数
            qmlSolt(str)
        }
    }

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.5
import testObj 1.0
Window {
    id: window
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

//    MyObject {
//        id: myobj
//        iValue: 20
//        sString: "test"

//    }

    function qmlSolt(str) {
        console.log(str)
    }

    signal qml_signal(string str)
    Button {
        onClicked: {
            //C++发送信号
            MyObject.myFunction()
        }
    }

    Connections {
        target: MyObject
        function onSignal_Cpp(str) {
            //qml槽函数
            qmlSolt(str)
        }
    }


}
5 C++调用QML端函数

//main.c  load后获取qml对象
    auto obj_list = engine.rootObjects();
    auto window = obj_list.first();

 //调用QML函数
    QMetaObject::invokeMethod(window,"qmlFunction",
                              Q_RETURN_ARG(QVariant,res),
                              Q_ARG(QVariant,arg1),
                              Q_ARG(QVariant,arg2)
                              );

mian.qml

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.5
import testObj 1.0
Window {
    id: window
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")



    function qmlFunction(arg1,arg2) {
            return arg1 + arg2;
    }


}

mian.c文章来源地址https://www.toymoban.com/news/detail-650476.html

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtQml/qqml.h>
#include "myobject.h"

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlContext *context1 = engine.rootContext();
    context1->setContextProperty("test",200);
    qmlRegisterType<MyObject>("testObj",1,0,"MyObject");

    //qmlRegisterSingletonInstance("testObj",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);
    //获取qml对象
    auto obj_list = engine.rootObjects();
    auto window = obj_list.first();

    QVariant res;
    QVariant arg1 = "arg1";
    QVariant arg2 = "arg2";
    //调用QML函数
    QMetaObject::invokeMethod(window,"qmlFunction",
                              Q_RETURN_ARG(QVariant,res),
                              Q_ARG(QVariant,arg1),
                              Q_ARG(QVariant,arg2)
                              );
    qDebug()<<res;

    return app.exec();
}

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

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

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

相关文章

  • 【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角

    在探讨 Qt 的世界时,我们不仅是在讨论一种编程框架,更是在探索一种将复杂技术细节隐藏于幕后、让开发者专注于创造性工作的艺术形式。正如著名的计算机科学家 Edsger Dijkstra 所言:“简洁是复杂性的先决条件。” 在这一章节中,我们将探讨 Qt 事件机制的基础概念,这

    2024年02月22日
    浏览(43)
  • 98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

    在上章我们只是简单实现了曲线图和折线图的显示: 79.qt qml-如何在QML中使用QCustomPlot之曲线/折线示例(已适配黑白风格)_qml 折线图_诺谦的博客-CSDN博客 所以本章实现综合示例、并添加多种功能如下所示: 详细显示:鼠标任意移动显示具体值内容 鼠标右击: 弹出菜单栏,支持

    2024年02月05日
    浏览(50)
  • 【QT】C++和QML使用多线程优化界面切换卡顿的方法

    qt提供了一种声明式语言qml,可以使用一些可视组件以及这些组件之间的交互来描述用户界面,而c++可以只负责后台逻辑的处理,将界面和后台分离开来,由qml来做UI界面,c++负责后端处理,对我个人来说,这样的方式大大的方便了对界面和逻辑的修改和维护; 由于UI界面是工

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

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

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

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

    2024年01月19日
    浏览(39)
  • 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日
    浏览(28)
  • 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日
    浏览(35)
  • QML与C++交互详解

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

    2024年01月20日
    浏览(27)
  • 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日
    浏览(26)
  • Qml Qt程序 打包部署

    利用qtcreator安装目录下的命令行工具执行打包命令 1、Widget程序打包 // 将release模式下的exe文件放在单独的打包目录下 // 打开qt自带的命令行工具,执行下面的语句 windeployqt path-to-app-binary  // path-to-app-binary表示需要打包的二进制文件 2、Qml程序打包 // 延用Widget程序打包步骤,

    2024年02月09日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包