【QML】C++访问QML控件

1、c++修改qml控件的属性

qml文件

cpp 复制代码
import QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle{
        objectName: "rect"
        width: 300
        height: 300
        color: "red"

    }

}

main.cpp文件

cpp 复制代码
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlProperty>
#include <QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;     //QML是使用引擎(QQmlApplicationEngine)把QML里面的对象树渲染出来的
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreationFailed,
        &app,
        []() { QCoreApplication::exit(-1); },
        Qt::QueuedConnection);
    engine.loadFromModule("QmlCpp", "Main");


    QObject *obj = engine.rootObjects().first();
    qDebug() << "root obj size :" << engine.rootObjects().size() << obj;

    QQmlProperty(obj, "title").write("hello window.");
    QQmlProperty(obj, "width").write("300");
    QQmlProperty(obj, "height").write("300");

    QObject *rect = obj->findChild<QObject *>("rect");
    QQmlProperty(rect, "color").write("blue");
    QQmlProperty(rect, "width").write("100");
    QQmlProperty(rect, "height").write("100");

    return app.exec();
}

如上图可知,在qml文件里面的qml控件的属性已经被cpp文件的中c++修改了。

为啥可以修改呢?

QML是使用引擎(QQmlApplicationEngine )把QML里面的对象树渲染(直接使用GPU)出来的

那么使用

QObject *rect = obj->findChild<QObject *>("rect");

QQmlProperty(rect, "color").write("blue");

这些就可以使用obj->findChild<QObject *>("rect"); 根据对象的名字找到对应的对象,然后使用QQmlProperty修改对的应的属性了。

2、c++访问qml的功能

cpp 复制代码
import QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    signal sig()

    onSig: {
        console.log("window sig is trigger .")
    }

    function func(arg){
        console.log("func arg is :", arg)
        return "funcRet"
    }

    Rectangle{
        objectName: "rect"
        width: 300
        height: 300
        color: "red"

    }

}

main.cpp中加入以下代码

cpp 复制代码
QMetaObject::invokeMethod(obj, "sig");
QVariant ret;  //获取函数的返回值的
//Q_RETURN_ARG(QVariant, ret),这个第一个的参数是返回值的类型,第二个参数是返回值
//Q_ARG(QVariant, "qweqwe"),第一个是传入参数的类型,第二个是参数的值
QMetaObject::invokeMethod(obj, "func", Q_RETURN_ARG(QVariant, ret), Q_ARG(QVariant, "qweqwe"));
qDebug() << "main.cpp func ret :" << ret;

执行结果:

如上图,信号和函数和返回值都触发成功了。

3、qml信号触发c++中的槽函数

先创建一个c++类,然后写一个槽函数

c++槽函数

cpp 复制代码
#include "sigtest.h"

#include <QDebug>

SigTest::SigTest() {}

void SigTest::printfFunc()
{
    qDebug() << "SigTest::printfFunc";
}

如上图,触发了qml中的信号后,就打印出c++中的槽函数。

相关推荐
汉克老师2 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6663 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
风合星语4 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
91刘仁德4 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
库玛西5 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海5 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
0+1115 小时前
算法 --滑动窗口
c++·算法·leetcode
stolentime6 小时前
(有原题)CSP-S2026第一轮试题(附答案解析、markdown源码)
c++·csp
m0_734571766 小时前
深入理解C++ RAII
开发语言·c++
hetao17338376 小时前
2026-09-18 hetao1733837 的刷题记录
c++·算法