Reputation: 182
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
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