QML与C++交互

本文介绍了如何在QML中调用C++类,包括类的定义、成员变量和函数的声明,以及Q_PROPERTY和Q_INVOKABLE宏的使用。同时,详细阐述了C++类与QML之间的信号和槽函数的绑定方法,包括在C++端调用QML函数和QML调用C++函数的实现过程。
摘要由CSDN通过智能技术生成

在QML中调用C++类

首先定义类对象时需要继承QObject,同时要包含头文件#include <QtQml>;
对于成员变量,可使用 alt+回车 自动生成两个成员函数,分别是返回变量值与设置变量值,并需要添加关于该变量改变所触发的信号函数
如对私有成员变量int m_num,利用宏定义函数

Q_PROPERTY(int num MEMBER m_num NOTIFY numChanged)

其中num为在QML中的变量名,m_num便是该类变量名,numChanged为信号函数名
信号函数的作用是为了实现在qml中的动态绑定

同时,若想在qml中使用c++类对象成员函数,可在函数前声明宏Q_INVOKEABLE,如

Q_INVOKABLE void func();

之后,在main.cpp源文件中对该类进行注册,如该类名称为QmlTest,则

qmlRegisterType<QmlTest>("MyObj", 1, 0, "QmlTest");

qmlRegisterType为模板函数,第一个参数为对类对象自定义的别名,第二、三个参数为主版本号与次版本号,第四个参数为类对象名称。注意,注册操作一定要在qml加载前完成,也就是必须在const QUrl url(...)调用前写上。注册完成便可在qml中引入

import MyObj 1.0

之后便可以控件方式去调用该类对象,以及执行其成员函数如下(通过button控件点击来执行成员函数func()以及改变成员变量num值)

    QmlTest{
        id: q1
        num: 100
        Component.onCompleted: {
            console.log("num is ", num)
        }
    }
    Button{
        id: but1
        objectName: "but1"
        width: 100
        height: 50
        onClicked: {
            q1.num=500
            q1.func()
        }
    }

c++类对象发送信号并在qml连接槽函数

若c++类有信号函数

    void cppsig(int i);

可在qml端通过Connections实现信号槽的绑定 

    Connections{
        target: q1
        function onCppsig(i){
            console.log(i)
        }
    }

qml发送信号并绑定c++对象槽函数

若qml有信号函数

    signal qmlsignal(int num, string str)

共有如下绑定方式

   /*方式一*/
Connections{
       target: window
       function onQmlsignal(i,s){
            q1.cppslot(i,s)
       }
    }
   /*方式二*/
Component.onCompleted: {
       qmlsignal.connect(q1.cppslot)
   }

或者在main.cpp源文件中,在engine已经load完成后,即在

    engine.load(url);

后,获取qml的相应控件,并通过QObject::connect进行绑定,注意,findChild中的参数为objectname,且模板一般选取QObject*即可

    auto list = engine.rootObjects();
    auto window = list.first();//获取根控件window
    auto buttonobj = list.first()->findChild<QObject*>("but1");//获取根控件以下子控件
    QObject::connect(window, SIGNAL(qmlsignal(int, QString)), &qobj, SLOT(cppslot(int, QString)));

在c++端调用qml函数

若在qml端有函数

    function qmlfunc(i,s){
        return "QMLFUNC"
    }

在main.cpp源文件中先获取控件(操作如上)再添加变量,由于该函数有两个参数一个返回值,故
分别定义res存储返回值,arg1,arg2为参数值,并使用QMetaObject::incokeMethod函数进行调用,其中第一个参数为函数所属空间名称,第二个参数为函数名,随后是返回值与参数

QVariant res;
QVariant arg1 = 666;
QVariant arg2 = "888";
QMetaObject::invokeMethod(window, 
"qmlfunc", 
Q_RETURN_ARG(QVariant, res), 
Q_ARG(QVariant, arg1), 
Q_ARG(QVariant, arg2));//调用qml函数



qDebug()<<res;//输出函数返回值

QMLC++ 交互的过程一般分为以下几个步骤: 1. 定义 C++ 类并注册到 QML 中 你需要在 C++ 中定义一个类,该类封装了你想要实现的功能。同时,你需要使用 `qmlRegisterType` 函数将该类注册到 QML 中,以便在 QML 中使用该类。 例如,你可以定义一个名为 `MyClass` 的类,并将其注册到 QML 中: ```cpp class MyClass : public QObject { Q_OBJECT public: Q_INVOKABLE int myFunction(int arg) { // 实现你的功能 } }; qmlRegisterType<MyClass>("com.example", 1, 0, "MyClass"); ``` 在上面的代码中,`Q_INVOKABLE` 用于声明 `myFunction` 函数可从 QML 中调用,`qmlRegisterType` 函数用于将 `MyClass` 类注册到 QML 中。`"com.example"` 表示注册的命名空间,`1` 和 `0` 表示主版本号和次版本号,`"MyClass"` 是在 QML 中使用的类名。 2. 在 QML 中使用 C++ 类 在 QML 中使用 C++ 类时,你需要使用 `import` 语句导入该类所在的命名空间。然后,你可以通过该命名空间来访问该类。例如: ```qml import com.example 1.0 MyClass { id: myClass } Button { onClicked: { var result = myClass.myFunction(42) // 处理返回值 } } ``` 在上面的代码中,`import` 语句用于导入 `com.example` 命名空间,`MyClass` 用于创建一个 `MyClass` 实例,`id` 属性用于设置实例的标识符,`Button` 用于创建一个按钮,`onClicked` 事件处理程序中调用了 `myFunction` 函数,并处理了它的返回值。 3. 在 C++ 中访问 QML 中的对象 如果你需要从 C++ 中访问 QML 中的对象,你可以使用 `QQuickItem` 类提供的 `findChild` 函数。例如: ```cpp QQuickItem *item = qmlEngine.rootObjects().value(0)->findChild<QQuickItem*>("myItem"); if (item) { // 处理 item 对象 } ``` 在上面的代码中,`qmlEngine.rootObjects()` 函数返回 QML 引擎中所有的根对象,`value(0)` 返回第一个根对象,`findChild` 函数用于查找名为 `"myItem"` 的子对象。 以上就是 QMLC++ 交互的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值