QML中定义信号,C++定义槽函数,C++方式连接信号槽
main.qml:
import QtQuick 2.0
Rectangle {
width: 200
height: 200
signal sendMessage(string message)
MouseArea {
anchors.fill: parent
onClicked: {
sendMessage("Hello from QML!")
}
}
}
在这个QML文件中,定义了一个名为sendMessage的信号,它将一个字符串参数传递给与之关联的槽。
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QObject>
class MessageHandler : public QObject
{
Q_OBJECT
public slots:
void handleMessage(const QString &message) {
qDebug() << "Message received from QML:" << message;
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<MessageHandler>("com.example", 1, 0, "MessageHandler");
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject *rootObject = engine.rootObjects().first();
if (rootObject) {
MessageHandler messageHandler;
QObject::connect(rootObject, SIGNAL(sendMessage(QString)),
&messageHandler, SLOT(handleMessage(QString)));
}
return app.exec();
}
在C++代码中,首先需要定义一个用于处理信号的类(在这个例子中是MessageHandler类),并在其中定义一个槽函数handleMessage,用于处理从QML发送过来的消息。
然后,通过qmlRegisterType将这个类注册到QML类型系统中。在main()函数中,通过QQmlApplicationEngine加载QML文件,然后找到根对象,并将其与C++中的槽函数连接起来。
这样,当在QML中触发了sendMessage信号时,与之关联的槽函数handleMessage将被调用,从而实现了QML与C++之间的信号槽关联
或者QML直接调用示实例中的槽函数
import QtQuick 2.0
import QtQuick.Window 2.2
Window {
visible: true
width: 400
height: 200
// 导入C++类
MyClass {
id: myClass
}
Button {
text: "Call C++ Slot"
onClicked: {
// 调用C++槽函数
myClass.cppSlot();
}
}
}
QML中定义信号及Javascript 槽函数,并连接
import QtQuick 2.0
Item {
id: root
Rectangle {
id: rect
signal sendMessage()
}
//JavaScript 槽函数
function handleCppSignal() {
console.log("Received signal from QML")
}
// 连接信号到 JavaScript 函数
Component.onCompleted: {
rect.sendMessage.connect(handleCppSignal)
}
}
C++ 类中定义信号 QML调用
C++
// MyClass.h
#pragma once
#include <QObject>
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = nullptr);
signals:
void cppSignal();
};
MyClass::MyClass(QObject *parent) : QObject(parent) {}
QML
import QtQuick 2.0
import QtQuick.Window 2.2
Window {
visible: true
width: 400
height: 200
// 导入C++类
MyClass {
id: myClass
}
// 在QML中定义一个函数来响应信号
function handleCppSignal() {
console.log("Received signal from C++")
}
// 连接信号到QML函数
Component.onCompleted: {
myClass.cppSignal.connect(handleCppSignal)
}
Button {
text: "Emit C++ Signal"
onClicked: {
// 发射C++信号
myClass.cppSignal();
}
}
}