//experimentrun.h文件
#ifndef EXPERIMENTRUN_H
#define EXPERIMENTRUN_H
#include <QObject>
#include <QQuickItem>
#include <QWidget>
class ExperimentRun : public QObject
{
Q_OBJECT
public:
explicit ExperimentRun(QObject *parent = nullptr);
Q_INVOKABLE void init(); //这是experimentrun.h文件内容 必须加Q_INVOKABLE
signals:
};
#endif // EXPERIMENTRUN_H
//experimentrun.cpp文件
#include "experimentrun.h"
#include <QDebug>
ExperimentRun::ExperimentRun(QObject *parent) : QObject(parent)
{
}
void ExperimentRun::init()
{
qDebug()<<"你是谁";
}
//这是 experimentrun.cpp 里面的内容 用于qml文件调用init()函数里面的打印
//main.cpp文件
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "experimentrun.h" //引入c++头文件
int main(int argc, char *argv[])
{
// qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
//其中 Type:要注册的C++类型名称。 <ExperimentRun>
uri:用于标识该类型的命名空间URI. "ExperimentRun"
majorVersion:主版本号 1
minorVersion:次版本号。 0
qmIName:在QML中使用的类型名称。 "ExperimentRun"
qmlRegisterType<ExperimentRun>("ExperimentRun", 1, 0, "ExperimentRun");
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
//main.qml文件
import QtQuick 2.12
import QtQuick.Window 2.12
import ExperimentRun 1.0 //调用刚刚注册c++文件
Window {
id: window
visible: true
width: 800
height: 500
title: qsTr("NucleicAcidExtract")
ExperimentRun{ //实例化一下
id: myInstance
}
// 按钮触发C++函数 点击按钮触发打印函数
Button {
text: "Call C++ Function"
onClicked: myInstance.init()
}
下面是QML文件和C++文件通信效果 【有用的话,给我点个赞吧】