【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!")
        }
    }
}
相关推荐
2601_949814695 小时前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
人机与认知实验室8 小时前
MyThos已不再是人机交互,而是机环交互
人机交互·交互
AI先驱体验官1 天前
臻灵:数字人+大模型,实时交互的技术临界点在哪里
大数据·人工智能·深度学习·microsoft·重构·开源·交互
大橘1 天前
【qml-5.1】qml与c++交互(QML_ELEMENT/QML_SINGLETON)
开发语言·c++·qt·交互·qml
UXbot1 天前
如何用 AI 快速生成完整的移动端 UI 界面:从描述到交付的实操教程
前端·ui·交互·ai编程·原型模式
ZC跨境爬虫1 天前
3D 地球卫星轨道可视化平台开发 Day1(3D 场景、卫星渲染与筛选交互实现)
前端·3d·html·json·交互
小白学大数据1 天前
Python 实现可交互滑块拼图,图形拖拽移动无卡顿
爬虫·python·microsoft·交互
UXbot2 天前
如何用 AI 生成产品原型:从需求描述到可交互界面的完整 5 步流程
前端·人工智能·ui·交互·ai编程
xcjbqd02 天前
Qt Quick中QML与C++交互详解及场景切换实现
c++·qt·交互
cy_cy0022 天前
从平面到立体:电子沙盘在城市规划展示中的创新应用
大数据·科技·人机交互·交互·软件构建