在Qml中调用c++ 函数的两种实现方法

如果要在QML中调用C++类中的Q_INVOKABLE类型的函数,可以直接在QML中使用该函数,无需使用Connections元素。下面是一个简单的示例,演示如何在QML中调用C++类中的Q_INVOKABLE函数:

假设有一个C++类MyClass,其中包含一个Q_INVOKABLE函数cppFunction,我们希望在QML中调用这个函数。

// MyClass.h
#ifndef MYCLASS_H
#define MYCLASS_H

#include <QObject>

class MyClass : public QObject
{
Q_OBJECT

public:
explicit MyClass(QObject *parent = nullptr);

Q_INVOKABLE void cppFunction();
};

#endif // MYCLASS_H

 

// MyClass.cpp
#include "MyClass.h"

MyClass::MyClass(QObject *parent) : QObject(parent)
{
}

void MyClass::cppFunction()
{
// 实现C++函数的逻辑
}

 

import QtQuick 2.0

Item {
id: root

Component.onCompleted: {
myCppObject.cppFunction(); // 在QML中调用C++的Q_INVOKABLE函数
}
}

 

 

在主应用程序中,我们需要将MyClass实例化并将其传递给QML引擎:

QQmlApplicationEngine engine;
MyClass myCppObject;
engine.rootContext()->setContextProperty("myCppObject", &myCppObject);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

除了将C++对象实例传递给QML引擎的方式,还有另一种常用的方法是使用qmlRegisterType注册C++类,使其在QML中可用。这种方法允许在QML中直接创建C++类的实例,而无需在C++中实例化并传递对象。

下面是一个示例,演示如何使用qmlRegisterType注册C++类,使其在QML中可用:

这种方法适用于需要在QML中创建多个实例的情况,而不仅仅是单例对象。

// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "myclass.h"

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

qmlRegisterType<MyClass>("MyClasses", 1, 0, "MyClass");

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

return app.exec();
}

// main.qml
import QtQuick 2.0
import MyClasses 1.0

Item {
Component.onCompleted: {
var myObject = new MyClass();
myObject.cppFunction();
}
}

posted @   Azuki_op  阅读(135)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示