首页 > 编程语言 >C++ 与 QML 进行交互

C++ 与 QML 进行交互

时间:2023-08-15 23:00:52浏览次数:42  
标签:QVariant MyTest object C++ QObject QML include 交互 rect

C++调用QML中的函数

//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QObject *object = engine.rootObjects().first();
    QObject *rect = object->findChild<QObject*>("rect");
    if(object){
        QVariant sum;
        QMetaObject::invokeMethod(object, "myAdd", Q_RETURN_ARG(QVariant, sum), Q_ARG(QVariant, 1), Q_ARG(QVariant, 2));
        if(sum.isValid()){
            qDebug() << "sum : " << sum.toDouble();
        }
    }

    if(rect){
        QMetaObject::invokeMethod(rect, "myPrint");
    }

    return app.exec();
}
import QtQuick 2.9
import QtQuick.Window 2.2

Window {

    function myAdd(left, right){
        return left + right;
    }

    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle{
        id: rect
        objectName: "rect"

        function myPrint(){
            console.log(rect.width + "x" + rect.height + "rectangle");
        }

        width: 40
        height: 40
        color: "red"
        anchors.centerIn: parent
    }
}

这就是最简单的 C++ 调用 qml的函数。 **注意 : ** 如果是按照正常的 javaScript函数的写法,因为 JavaScript是弱类型语言。所有在QT中参数包括返回值的类型都要使用QVariant来代替。而且如果要获取返回值在 QMetaObject::invokeMethod 一定要把 Q_RETURN_ARG写在第一个Q_ARG参数的前方。如果想要调用的 qml 的函数不是在根 object 中,那么还要在qml的对象中设置objectName属性。然后QT C++使用 findChild找到该 对象后然后在进行调用。

C++中链接qml中的信号或者槽

//MyTest.h
#ifndef MYTEST_H
#define MYTEST_H

#include <QObject>

class MyTest : public QObject
{
    Q_OBJECT
public:
    explicit MyTest(QObject *parent = nullptr);

signals:

public slots:
    void slotClick();
};

#endif // MYTEST_H
//MyTest.cpp
#include "MyTest.h"
#include <QDebug>

MyTest::MyTest(QObject *parent) : QObject(parent)
{

}

void MyTest::slotClick()
{
    qDebug() << QStringLiteral("按钮点击了");
}
//main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {

    function myAdd(left, right){
        return left + right;
    }

    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Button{
        id: button
        objectName: "button"
        width: 40
        height: 20
        text: "按钮"
    }
    Rectangle{
        id: rect
        objectName: "rect"

        function myPrint(){
            console.log(rect.width + "x" + rect.height + "rectangle");
        }

        width: 40
        height: 40
        color: "red"
        anchors.centerIn: parent
    }
}
//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include "MyTest.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    QObject *object = engine.rootObjects().first();
    QObject *rect = object->findChild<QObject*>("rect");
    if(object){
        QVariant sum;
        QMetaObject::invokeMethod(object, "myAdd", Q_RETURN_ARG(QVariant, sum), Q_ARG(QVariant, 1), Q_ARG(QVariant, 2));
        if(sum.isValid()){
            qDebug() << "sum : " << sum.toDouble();
        }
    }

    if(rect){
        QMetaObject::invokeMethod(rect, "myPrint");
    }

    MyTest *test = new MyTest;
    QObject *button = object->findChild<QObject*>("button");
    QObject::connect(button, SIGNAL(clicked()), test, SLOT(slotClick()));

    return app.exec();
}

**注意 ** 要注意的点就是使用的是 QObject::connect 是QT4的连接方式。注意QT4的连接方式是这么写的。

标签:QVariant,MyTest,object,C++,QObject,QML,include,交互,rect
From: https://blog.51cto.com/u_15885923/7095145

相关文章

  • C++中const修饰符的含义
    const修饰符在C++中的用途主要是四类:1,变量类型声明的修饰:禁止对变量或对象的修改;2,函数形参中的声明修饰:禁止对传递的对象作修改,或禁止对引用变量作修改;3,函数返回类型前的修饰:禁止修改函数返回的对象;4,类成员函数声明(小括号之后、大括号之前)末尾的修饰:禁止该成员函数修改类中的任何......
  • QT使用QML实现地图绘制虚线
    QML提供了MapPolyline用于在地图上绘制线段,该线段是实线,因此我使用Canvas自定义绘制的方式在地图上绘制线段,如图:鼠标在地图上点击后,在点击位置添加图标,当有多个图标被添加到地图上后,计算各个图标间的距离,并创建一个新的虚线线段组件,连接两个图标点,显示距离数值。如果对自定义图标......
  • 使用C++界面框架ImGUI开发一个简单程序
    目录简介使用示例下载示例main文件设置ImGui风格设置字体主循环添加Application类中文编码问题界面设计关于imgui_demo.cpp创建停靠空间创建页面隐藏窗口标签栏创建导航页面创建内容页面隐藏控制台窗口打包程序总结待解决问题开发优势附件简介ImGui是一个用于C++的用户界面库,跨......
  • C++ STL iota 使用方法
    C++STLiota用法介绍c++11引入的函数,C++20后小更新使用#include<numeric>头文件引用功能std::iota[aɪ'otə]输入一个值和一个容器的开始地址和结束地址,对该容器进行自增填充。Example点击查看代码#include<numeric>#include<vector>usingnamespacestd;intma......
  • JavaScript基础:学习JavaScript语言的基本语法和常用操作,了解网页交互的基本原理
    JavaScript是一种广泛应用于网页开发中的脚本语言,它可以与HTML和CSS一起使用,实现网页交互及动态效果。以下是JavaScript的基本语法和常用操作:变量声明:使用var、let或const关键字声明变量。varname="John";letage=25;constPI=3.14;数据类型:包括字符串、数字、布......
  • chatGPT用C++写的HMAC-SHA256函数
    以下内容全为chatGPT生成:#include<openssl/hmac.h>#include<openssl/sha.h>#include<iostream>#include<iomanip>std::stringhmac_sha256(conststd::string&key,conststd::string&data){unsignedcharhash[SHA256_DIGEST_L......
  • C++简单动态链接库的创建和引用(VS2022)
    原文:https://blog.csdn.net/XianLiangcheese/article/details/127125135总结在前:创建dll:1.打开VS2022,创建一个“动态链接库”新项目2.建立一个需要导出的类3.编辑导出类里面的内容,其中需要在导出的方法,也就是在外面引用的方法,只需要在其类型声明前面加上“__declspec(dllexport)......
  • C++语言常见知识点
    C++基础变量存在的意义是什么?作用:给一段指定的内存空间起名,方便我们管理操作这块内存。inta=10;常量的两种定义方式1、#definePI3.14 2、constinta=10;用于记录程序中不可更改的数据。标识符的命名规则1、不能是关键字2、只能由字母、下划线、数字构成3、不能数字......
  • QML NextQT
    2017年我写了一篇QML从入门到放弃如今2023年,过去6年了。QML是我认为真正革命GUI技术拥抱QML,拥抱声明式GUI.QWidget彻底成为过去式了1.PropertyBinding比如画布有2个盒子AB,A盒子变化大小,B盒子跟着一起干,这个在Qt就直接绑定完事Rectangle{id:Awidth:200heig......
  • C++黑马程序员——P228. pair对组
    P228.pair使用——pair对组的创建功能描述:  成对出现的数据,利用对组可以返回两个数据两种创建方式:pair<type,type>p(value1,value2);pair<type,type>p=make_pair(value1,value2);#include<iostream>#include<string>usingnamespacestd;//pair对组创建v......