【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++中的槽函数。

相关推荐
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
小灰灰搞电子8 小时前
完全驾驭 Qt 与数据库:C++ ORM 框架 QxOrm 原理与实践指南
数据库·c++·qt
QT界面美化性能优化8 小时前
QT+AI:使用AI技术为QT应用程序赋能
c++·人工智能·qt·opencv·qt教程·qt6.3
学习星球10 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
小灰灰搞电子11 小时前
C++ 引用折叠详解
c++
布莱克60511 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
牛油果子哥q12 小时前
C++内存池与对象池精讲:内存碎片、自定义分配器、对象池实现、STL allocator原理、工程落地与性能对比
java·开发语言·c++
万法若空13 小时前
C/C++ 类型别名定义方式对比
java·c语言·c++
小小晓.14 小时前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
hetao173383715 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法