当前位置: 首页 > news >正文

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: 640height: 480visible: truetitle: qsTr("Hello World")MyObject {iValue: 20sString: "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: windowwidth: 640height: 480visible: truetitle: qsTr("Hello World")MyObject {id: myobjiValue: 20sString: "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);
#endifQGuiApplication 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: windowwidth: 640height: 480visible: truetitle: 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: MyObjectfunction 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: windowwidth: 640height: 480visible: truetitle: qsTr("Hello World")function qmlFunction(arg1,arg2) {return arg1 + arg2;}}

mian.c

#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);
#endifQGuiApplication 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();
}

http://www.lryc.cn/news/125653.html

相关文章:

  • Microsoft ISA服务器配置及日志分析
  • Openlayers 实战 - 地图视野(View)- 图层 -(layer)- 资源(source)显示等级设置。
  • Linux:shell脚本 正则表达式与AWK
  • Android UI自动化测试框架—SoloPi简介
  • Android Studio Giraffe 正式版下载地址
  • 【C语言】调试技巧
  • MySQL SUBSTRING_INDEX() 函数的详细介绍
  • 开源数据库Mysql_DBA运维实战 (DML/DQL语句)
  • 【LangChain】Memory
  • Java并发编程(六)线程池[Executor体系]
  • macOS CLion 使用 bits/stdc++.h
  • PS出现的问题——为什么PS另存的格式少了很多
  • 【Linux】进程通信篇Ⅱ:共享内存、消息队列、信号量
  • 8.14 校招 内推 面经
  • 阿里云服务器安装部署Docker使用教程
  • WebRTC | ICE详解
  • 网络设备(防火墙、路由器、交换机)日志分析监控
  • 2023年国赛数学建模思路 - 复盘:人力资源安排的最优化模型
  • Compute shader SV 理解图
  • 生信豆芽菜-多种算法计算免疫浸润
  • 逆向破解学习-单机斗地主
  • matplotlib绘制位置-时序甘特图
  • 数据库概述、部署MySQL服务、必备命令、密码管理、安装图形软件、SELECT语法 、筛选条件
  • 概率论与数理统计:第四章:随机变量的数字特征
  • 解决饿了么ui的对话框缩放和移动
  • Linux 中复制文件并保持修改时间等属性
  • Hugging News #0814: Llama 2 学习资源大汇总
  • ​可视化绘图技巧100篇进阶篇(五)-阶梯线图(Step Chart)
  • GPT带我学-设计模式-命令模式
  • 互联网发展历程:跨越远方,路由器的启示