在QML侧连接信号槽
- 在QML中声明一个信号
- 在C++中的类需要继承自Qobject
- 第一种方式使用Connections间接调用对象的槽函数
- 第二种方式在组件加载完成后使用信号的connect函数连接(为什么可以使用connect)因为声明了一个信号后,经过qmake后这个信号变成一个对象
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.5
import MyObj 1.0
Window {
id : window
width: 640
height: 480
visible: true
title: qsTr("Hello World")
signal qmlSig(var s, var i)
Button {
onClicked: {
qmlSig("张三", 20)
}
}
MyObject {
id : myobj
}
// 第一种绑定方式,
Connections {
target: window
function onQmlSig(s, i){
myobj.cppSlot(s, i)
}
}
// 第二种绑定方式
Component.onCompleted : {
qmlSig.connect(myobj.cppSlot)
}
}
在C++侧连接信号
在c++侧连接QML信号,需要使用qml引擎的rootObjects方法来找到要发射信号的对象,然后使用connect进行连接
int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<MyObject>("MyObj", 1, 0, "MyObject");
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);
// 下方代码为寻找QML中要发射信号的对象,找到后进行连接
MyObject myobj;
// 一定要在加载完QML后才能注册
auto listQmlObj = engine.rootObjects();
auto window = listQmlObj.first();
QObject::connect(window, SIGNAL(qmlSig(QString, int)),&myobj,SLOT(cppSlot(QString,int)));
return app.exec();
}