qml receives no signal from c++
-
This is my code, I use Q_PROPERTY to define a variable bmsMap, when I receive the signal from the outside, I call canResponse function to assign the value of bmsMap, I hope qml can listen to the change of bmsMap, but qml can not listen, Please help me see why?
bmsdemo.h
#ifndef BMSDEMO_H #define BMSDEMO_H #include <QObject> #include <QVariantMap> #include "zlg_candriver.h" class BmsDemo : public QObject { Q_OBJECT public: explicit BmsDemo(QObject* parent = nullptr); QVariantMap getBmsMap() const; void setBmsMap(const QVariantMap& newBmsMap); public slots: void canResponse(SIMPLEFRAMES frem); signals: void bmsMapChanged(); private: QVariantMap bmsMap = {}; Q_PROPERTY(QVariantMap bmsMap READ getBmsMap WRITE setBmsMap NOTIFY bmsMapChanged FINAL) }; #endif // BMSDEMO_H
bmsdemo.cpp
#include "bmsdemo.h" #include <QDebug> BmsDemo::BmsDemo(QObject* parent) : QObject{parent} {} void BmsDemo::canResponse(SIMPLEFRAMES frem) { QVariantMap newBmsMap; switch (frem.ID) { case 0x502: newBmsMap["tolVol"] = QString::number(((quint16)frem.data.byte[2] << 8) + frem.data.byte[3]); setBmsMap(newBmsMap); break; default: break; } } QVariantMap BmsDemo::getBmsMap() const { return bmsMap; } void BmsDemo::setBmsMap(const QVariantMap& newBmsMap) { if (bmsMap == newBmsMap) { return; } bmsMap = newBmsMap; emit bmsMapChanged(); }
main.cpp
qmlRegisterType<BmsDemo>("com.bmsDemo", 1, 0, "BmsDemo");
main.qml
Window { id: mainWindow width: 1024 height: 600 visible: true title: qsTr("hello") BmsDemo{ id: bmsDemo onBmsMapChanged: { console.log(bmsMap["tolVol"]) // cannot execute } } }
-
@xgj1 said in qml receives no signal from c++:
Please help me see why?
Did you make sure this line is actually executed:
emit bmsMapChanged();
?
-
@jsulm
I debug it, and you can see the ones with data, so emit bmsMapChanged(); It was executedvoid BmsDemo::setBmsMap(const QVariantMap& newBmsMap) { if (bmsMap == newBmsMap) { return; } bmsMap = newBmsMap; qDebug() << bmsMap["tolVol"]; emit bmsMapChanged(); }
debugging output:
QVariant(QString, "21") QVariant(QString, "24") QVariant(QString, "21") QVariant(QString, "24") QVariant(QString, "21") QVariant(QString, "24") QVariant(QString, "21") QVariant(QString, "24") QVariant(QString, "21")
-
@xgj1
I don't see the QML_ELEMENT macro, which is necessary to expose the C++ class to QML in the first place. So I wonder, how the QML code got compiled / interpreted at all.Have you followed this guideline for QML extensions?
-
@Axel-Spoerl
I used qmlRegisterType to register the c++ class. Can it be used instead of QML_ELEMENT? I want to listen for a property in a c++ class, but it does't workqmlRegisterType<BmsDemo>("com.bmsDemo", 1, 0, "BmsDemo");
-
This post is deleted!