Mohamed Anwer
Mohamed Anwer

Reputation: 182

Qml signal is not taking effect in C++

I've created a Qt Quick 2.5 app and connected signals and slots to my C++ module, I only can send signals from C++ and activate QML slots, but I can't receive QML signals on Qt side.

Here is main.cpp:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));

    AlfredApp(engine.rootObjects().first());

    return app.exec();
}

here is my QML code which holds the signal:

MouseArea {
    id: mainButtonMouseArea
    objectName: "mainButtonMouseArea"
    anchors.fill: parent

    signal signalClicked()

    onClicked: {
        console.log("clicked")
        signalClicked()
    }
}

I always get the console message from QML when I click on the MouseArea.

Here is my c++ constructor:

AlfredApp::AlfredApp(QObject* viewRootObject, QObject* parent)
    : QObject(parent), d(new Private)
{
    d->viewRootObject = viewRootObject;
    d->viewMainButton = viewRootObject->findChild<QObject*>("mainButton");
    d->viewMainButtonIcon = viewRootObject->findChild<QObject*>("mainButtonIcon");
    d->viewMainButtonMouseArea = viewRootObject->findChild<QObject*>("mainButtonMouseArea");

    // Signals/Slots connection

    connect(d->viewMainButtonMouseArea, SIGNAL(signalClicked()),
        this, SLOT(mainButtonClicked()));

    connect(this, SIGNAL(signalListening()),
        d->viewMainButtonIcon, SLOT(listening()));

    connect(this, SIGNAL(signalProcessing()),
        d->viewMainButtonIcon, SLOT(processing()));
}

Here is my slot that never gets called:

void AlfredApp::mainButtonClicked()
{
    qDebug() << "Main Button Clicked";
}

BTW, are there some qml code examples that have slots/function that respond normally to C++ signals

Upvotes: 0

Views: 804

Answers (1)

Tarod
Tarod

Reputation: 7170

Just for testing, could you connect the signal and the slot in main.cpp?

Something like this:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));

    QObject *rootObj = engine.rootObjects().first();
    QObject *item = rootObj->findChild<QObject*>("mainButtonMouseArea");

    AlfredApp alfredapp(rootObj);

    QObject::connect(item, SIGNAL(signalClicked()),
                         &alfredapp, SLOT(mainButtonClicked()));

    return app.exec();
}

This should work. If not, try the idea suggested by @hyde.

Here you have the sample code.

Upvotes: 0

Related Questions