Как подключиться к событию 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";
}
Другие вопросы по тегам