这里提供一个简单的例子,假设我们有一个QML控件和一个QWidget,需要实现它们之间的通信。具体步骤如下:
- 定义QML控件中的信号
在QML文件中定义一个信号:
signal qmlSignal(string text)
- 在C++代码中连接信号与槽
在C++代码中创建一个QObject对象,将其注册到QQmlEngine中,并将其作为上下文属性传递给QML控件。然后通过connect函数将该对象的自定义槽函数与QML控件中的信号进行连接。
#include <QtWidgets/QWidget>
#include <QtQuickWidgets/QtQuickWidgets>
class MyObject : public QObject
{
Q_OBJECT
public slots:
void handleQmlSignal(const QString& text) {
qDebug() << "Received signal from QML:" << text;
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QQmlEngine engine;
QQmlContext* context = new QQmlContext(engine.rootContext());
// 将MyObject对象注册为上下文属性
MyObject myObj;
context->setContextProperty("myObj", &myObj);
// 创建QQuickWidget并加载QML文件
QQuickWidget widget(&engine);
widget.setResizeMode(QQuickWidget::SizeRootObjectToView);
widget.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
// 连接信号和槽
QObject::connect(widget.rootObject(), SIGNAL(qmlSignal(QString)),
&myObj, SLOT(handleQmlSignal(QString)));
widget.show();
return app.exec();
}
- 在QML控件中发射信号
在QML文件中,我们可以通过调用signal语句来发射自定义信号:
import QtQuick 2.0
Rectangle {
signal qmlSignal(string text)
MouseArea {
anchors.fill: parent
onClicked: qmlSignal("Hello, World!")
}
}
这里我们定义了一个鼠标区域,在其被点击时会发射一个名为“qmlSignal”的自定义信号,并传递字符串参数。
现在,当用户单击QML控件时,就会触发该自定义信号并将消息传递给C++对象的槽函数进行处理。