Arnold
Arnold

Reputation: 29

Connect C++ signal to QML slot

I'm trying to connect a C++ signal with a QML slot.

The C++ signal is called userRegistered() and the QML slot is called userRegisteredQML().

In the C++ file, I have the following:

QQuickView view(QUrl::fromLocalFile("interface.qml"));

QObject *topLevel = view.rootContext();

connect(myClass, SIGNAL(userRegistered()), topLevel, SLOT(userRegisteredQML()));

And in the interface.qml, I have the slot userRegisteredQML:

function userRegisteredQML(){
    console.log("this is a test!");
}

The problem is that it does not show "this a test!". Therefore, I wanted to ask you if this is the proper way to connect a C++ signal to a QML slot.

Upvotes: 0

Views: 1594

Answers (2)

user16776498
user16776498

Reputation:

QML js functions are not slots.
You should just create the signal in C++ and in QML you handle it with on<signalName>.
The solution depends on where exactly that signal exists.
If it is a QML_ELEMENT you would handle it inside the component instantiation in QML:

SomeTypeFromC++ {
    onUserRegistered: {
        function() {
            do_something();
        }
    }
}

If it is in an engine rootContextProperty You can use Connections QML type:

Connections {
    target: appCore // The name of the context property
    function onUserRegistered() {
        do_something();
    }
}

Upvotes: 2

L&#225;szl&#243; Papp
L&#225;szl&#243; Papp

Reputation: 53215

Expose your object to QML in C++:

topLevel->setContextProperty("myClass", myClass);

In QML, you can use Connections:

Connections {
    target: myClass 
    userRegistered: {
        // do something with it here
    }
}

Upvotes: 1

Related Questions