Как подключиться к событию onClick элемента QML со стороны C ++ - PullRequest
0 голосов
/ 19 октября 2018

Сценарий:
У меня есть приложение 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 Ответ

0 голосов
/ 19 октября 2018

Метод, используемый для взаимодействия, может быть опасным в общем случае, потому что жизненный цикл элементов зависит от 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";
}
...