【QML】QML与cpp交互(一)—— QML直接调用cpp函数

目录

[1、cpp 创建一个类](#1、cpp 创建一个类)

2、将类对象暴露给QML

3、QML通过对象直接调用cpp函数


1、cpp 创建一个类

类模板如下:

cpp 复制代码
#include <QtCore/QObject>

class vacUdpClient: public QObject
{
    Q_OBJECT
public: 
    vacUdpClient(QObject* parent = nullptr): QObject(parent) {}

    // Q_INVOKABLE 将当前函数暴露给QML
    Q_INVOKABLE double triggerClickEvent(const QString& qstr);

private:
    /* data */
};

要求:

  • 使用 Q_OBJECT 宏需要继承 QObject 类。Q_OBJECT能够启用信号和槽机制、使用动态属性系统。(使用 Q_OBJECT 宏的类需要通过Qt的元对象编译器(moc)进行处理。)
  • 使用 Q_INVOKABLE 修饰要暴露给 QML 的函数。

2、将类对象暴露给QML

使用 setContextProperty 将 c++ 对象注册为qml可以识别的对象,setContextProperty两个参数表示的意义为:

  • 第一个参数表示 qml 可以识别的对象名
  • 第二个参数表示 C++ 对象
cpp 复制代码
#include <QtQml/QQmlContext>
#include "vacUdpClient.h"

/*** main.cpp ***/
vacUdpClient udpclient;
QQmlContext* context = engine.rootContext();
context->setContextProperty("udpclient", &udpclient);

3、QML通过对象直接调用cpp函数

javascript 复制代码
import QtQuick 2.0
import QtQuick.Controls 2.0

ApplicationWindow {
    width: 360
    height: 360
    visible: true

    Text {
        anchors.centerIn: parent
        text: "Hello, QML!"
    }

    Button {
        id: sendBtn
        text: "发送"
        onClicked: {
            // 这里的 udpclient 对应setContextProperty的第一个参数
            // triggerClickEvent 是 Q_INVOKABLE 暴露出来的函数
            udpclient.triggerClickEvent("hello, world!")
        }
    }
}
相关推荐
小雨下雨的雨2 小时前
蜡笔小画家鸿蒙PC用Electron框架 - 儿童学画蜡笔画技术实现详解
前端·javascript·华为·electron·前端框架·交互·鸿蒙系统
梓贤Vigo1 天前
【Axure原型分享】AI自动回复机器人
交互·产品经理·axure·原型
蓝速科技1 天前
蓝速科技 3D 全息数字人舱:像真人一样的交互体验展示
科技·3d·交互
JAMSAN09301 天前
视线即交互:眼动追踪AR眼镜的“感知革命”与市场蓝图
大数据·人工智能·ar·交互
周胡杰1 天前
HarmonyOS 手表端翻腕触发交互实现:基于陀螺仪的两段式手势识别
华为·交互·harmonyos
小北的AI科技分享1 天前
手机AI应用如何改变我们的日常交互方式
交互·应用·隐私
ZC跨境爬虫2 天前
跟着 MDN 学CSS day_41:显式轨道、隐式网格与区域命名放置
前端·javascript·css·ui·交互
AI品信智慧数智人2 天前
打破大屏局限!山东品信智慧科技数字人交互系统,实现可视化实时数据联动✨
科技·交互
2501_940041742 天前
前端工程化命题,覆盖性能/架构/交互
前端·交互
协享科技2 天前
Vue 3 实现抖音式卡片滑动交互:从零到完整方案
前端·vue.js·交互·ai编程·英语·自考英语