如何从 C++ 端连接到 QML 项目的 onClick 事件
How to hook up to the onClick event of a QML item from C++ side
场景:
我有一个在 Qt 5.9.4 商业版上运行的 Qt 应用程序。它是一个基于 QtQuick
和 QML
的应用程序,在 iOS 和 Android[ 上 运行 =35=]。
我在 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 中的任何内容。基本上从 C++ 端本身连接到 someItem
的 onClick 信号。我该怎么做?
用于交互的方法在一般情况下可能很危险,因为项目的生命周期取决于 QML,因此请确保不会发生这种情况。根据您的要求,我假设 MyCppClass 继承自 QObject 或子级 class 您必须创建一个插槽并使用旧的连接语法:
*.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";
}
场景:
我有一个在 Qt 5.9.4 商业版上运行的 Qt 应用程序。它是一个基于 QtQuick
和 QML
的应用程序,在 iOS 和 Android[ 上 运行 =35=]。
我在 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 中的任何内容。基本上从 C++ 端本身连接到 someItem
的 onClick 信号。我该怎么做?
用于交互的方法在一般情况下可能很危险,因为项目的生命周期取决于 QML,因此请确保不会发生这种情况。根据您的要求,我假设 MyCppClass 继承自 QObject 或子级 class 您必须创建一个插槽并使用旧的连接语法:
*.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";
}