方法一:
1. 使用QQmlContext (setContextProperty)注册
#include <QObject>
// 必须继承QObject
class MainModel : public QObject
{
Q_OBJECT
public:
// 需提供此构造方法
MainModel(QObject *parent = nullptr);
// 可供调用的方法
Q_INVOKABLE void test();
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
// 示例
MainModel mainModel;
engine.rootContext()->setContextProperty("MainModel", &mainModel);
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();
}
2. QML 中调用
Button {
text: "test"
Connections {
function onClicked() {
MainModel.test()
}
}
}
备注:直接通过注册的名称调用,无效导入
方法二:
1. 使用 qmlRegisterType 注册
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
// 示例
qmlRegisterType<MainModel>("MainModel.module", 1, 0, "MainModel");
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();
}
备注:MainModel类同方法一中
2. QML 中调用
import MainModel.module 1.0
MainModel {
id: mainModel
}
Connections {
// 响应C++信号示例
function onConnected() {
stateLine.color = "green"
}
function onDisconnected() {
stateLine.color = "red"
}
}
Connections {
function onClick() {
var filePath = filePathEdit._text.trim()
if (filePath.length == 0)
return
// 调用C++方法示例
mainModel.sendFile(filePath.replace("file:///", ""))
}
}