1、不采用在.qml文件中实例化C++类的方式,因此在main.cpp中注册单例
#include"myobject.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QScreen>
#include <QObject>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
//注册单例
qmlRegisterSingletonInstance<MyObject>("MyObj", 1, 0, "MyObject", MyObject::getInstance());
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
&app,
[]() { QCoreApplication::exit(-1); },
Qt::QueuedConnection);
engine.loadFromModule("updatePublisher", "Main");
return app.exec();
}
此时在cpp类中发送信号
void MyObject::func()
{
emit cppSig(101, "hello");
}
在.qml中控制cpp类发送信号,并在.qml中使用Connections建立连接
import QtQuick
import QtQuick.Controls
import MyObj 1.0
Window {
id: window
objectName: "window"
width: 480
height: 480
visible: true
title: qsTr("Hello World")
//槽函数
function qmlSlot(i, s) {
console.log("qml", i, s)
}
Button {
id: btn
objectName: "button"
signal qmlSig(int i, string s)
//按下按钮后,调用cpp类的func函数,在函数中发送信号
onClicked: {
MyObject.func()
}
}
//建立信号槽连接
Connections {
target: MyObject
function onCppSig(i, s) {
qmlSlot(i, s)
}
}
}
2、在main.cpp中建立连接
#include"myobject.h"
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QScreen>
#include <QObject>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterSingletonInstance<MyObject>("MyObj", 1, 0, "MyObject", MyObject::getInstance());
QObject::connect(
&engine,
&QQmlApplicationEngine::objectCreationFailed,
&app,
[]() { QCoreApplication::exit(-1); },
Qt::QueuedConnection);
engine.loadFromModule("updatePublisher", "Main");
auto list = engine.rootObjects();
auto window = list.first();
//参数类型一定要用QVariant
QObject::connect(MyObject::getInstance(), SIGNAL(cppSig(QVariant, QVariant)), window, SLOT(qmlSlot(QVariant, QVariant)));
return app.exec();
}