Как подключиться к событию onClick элемента QML со стороны C++
Сценарий:
У меня есть приложение Qt, которое работает на коммерческой версии Qt 5.9.4. Это QtQuick
а также QML
приложение на базе iOS и Android.
у меня есть 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
}
Вопрос:
Я хочу слушать событие onClick someItem
в методе C++ или лямбда-выражениях, не меняя ничего в QML. В основном подключите к сигналу сигнала onClick someItem
со стороны C++. Как мне это сделать?
1 ответ
Метод, используемый для взаимодействия, может быть опасным в общем случае, потому что жизненный цикл элементов зависит от QML, поэтому убедитесь, что этого не происходит. Переходя к вашему запросу, и я предполагаю, что MyCppClass наследуется от QObject или дочернего класса, вы должны создать слот и использовать старый синтаксис соединения:
*.час
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";
}