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

相关推荐
君义_noip1 天前
信息学奥赛一本通 1661:有趣的数列 | 洛谷 P3200 [HNOI2009] 有趣的数列
c++·算法·组合数学·信息学奥赛·csp-s
hele_two1 天前
快速幂算法
c++·python·算法
OopspoO1 天前
C++杂记——Name Mangling
c++
yuanmenghao1 天前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++
小羊羊Python1 天前
SoundMaze v1.0.1正式发布!
开发语言·c++
码小猿的CPP工坊1 天前
C++软件开发之内存泄漏闭坑方法
开发语言·c++
Benny_Tang1 天前
题解:CF2164C Dungeon
c++·算法
青小莫1 天前
C语言vsC++中的动态内存管理(内含底层实现讲解!)
java·c语言·c++
持梦远方1 天前
算法剖析1:摩尔投票算法 ——寻找出现次数超过一半的数
c++·算法·摩尔投票算法
AI视觉网奇1 天前
ue5 自定义 actor ac++ actor 用法实战
java·c++·ue5