QML中调用C++函数

时间:2022-09-29 11:29:28

步骤

  • 定义新的类,继承自QObject
  • 在类声明中定义public方法,函数定义之前加上Q_INVOKABLE关键字
  • 按正常的方法写出类的实现
  • 在main文件中包含该类,并加入QQmlEngine和QQmlContext等文件
  • 使用智能指针QScopedPointer实例化类
  • 使用engine.rootContext的setContextProperty方法将智能指针加入进应用程序中
  • 在QML文件中直接调用函数即可

代码:

类头文件

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

Q_INVOKABLE void test();
Q_INVOKABLE double add(double x, double y);
};

类文件

void Voronoi::test()
{
qDebug()<<"hello form c++";
}
double Voronoi::add(double x, double y)
{
return x+y;
}

main文件

#include <QQmlEngine>
#include <QQmlContext>
#include "voronoi.h"

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

QScopedPointer<Voronoi> voronoi(new Voronoi);
//voronoi.data()指向智能指针中的类对象,如果voronoi是一个普通指针,则voronoi.data()改为voronoi即可
engine.rootContext()->setContextProperty("voronoi", voronoi.data());

if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}

QML文件

 MouseArea{
anchors.fill: parent
onPressed:{
voronoi.test()
var result = voronoi.add(12.3, 3.0)
console.log(result)
}
}