如何从C++端挂接到 QML 项的 onClick 事件

How to hook up to the onClick event of a QML item from C++ side

本文关键字:QML 项的 onClick 事件 C++      更新时间:2023-10-16

场景:
我有一个运行在Qt 5.9.4商业版上的Qt应用程序。它是一个基于QtQuickQML的应用程序,在iOSAndroid上运行。

我在 UI 上有一个QML项目,如下所示:

SomeItem {
text: qsTr("Some Item")
objectName: "someitem"
visible: false
onClicked: {
console.log("Some item was clicked")
}
}

我有一个C++功能,可以轻松控制SomeItem的属性。

void MyCppClass::Func() {
QQuickItem *someItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("someitem");
someItem->setVisible(true); // this works
// How to listen to someItem's onClick event here
}

问:
我想在 C++ 方法或 lambda 中侦听someItem的 onClick 事件,而不更改 QML 中的任何内容。基本上从一侧本身连接到someItemC++的onClick信号。我该怎么做?

在一般情况下,用于交互的方法可能很危险,因为项目的生命周期取决于 QML,因此请确保它不会发生。转到您的请求,我假设MyCppClass继承自QObject或子类,您必须创建一个插槽并使用旧的连接语法:

*.h

class MyCppClass: public QObject
{
...
private slots:
void on_clicked();
...
};

*。.cpp

void MyCppClass::Func() {
QQuickItem *someItem = qml_engine->rootObjects()[0]->findChild<QQuickItem*>("someitem");
if(!someItem)
return;
someItem->setVisible(true); // this works
connect(someItem, SIGNAL(clicked()), this, SLOT(on_clicked()));
}
void MyCppClass::on_clicked(){
qDebug()<<"on clicked";
}