qmlregistered with c++
-
Error: Cannot assign QObject* to an unregistered type
Please Help me out with the error.
-
Error: Cannot assign QObject* to an unregistered type
Please Help me out with the error.
@balaji2830 please provide a minimal and reproducible example.
-
@eyllanesc I'm here to access SplineSeries chart to c++ object with pointer, Please find the reference
QML
SplineSeries{ id: _xySeries; axisX: _axisX; axisY: _axisY; width: 3 // color: Qt.rgba(0.918, 0.302, 0.247, 1) color: "black" style: Qt.SolidLine capStyle: Qt.FlatCap }
Component.onCompleted: { availableDeviceLabel.visible = false updateInfoLabel.visible = false if(true) { // console.info("ON COMPLETED TestCommunication") pumpControllerViewModel.heartRateGraph = _xySeries // console.info("!!!!!!!!!!!!!! SET Graph pointer !!!!!!!!!!!!!!!!") } else { // console.info("Graph pointer is not nullptr") } }
C++
#include "blewindow.h" #include "ui_blewindow.h" bleWindow::bleWindow(QWidget *parent) : QWidget(parent), ui(new Ui::bleWindow) { ui->setupUi(this); Q_INIT_RESOURCE(QML); Q_INIT_RESOURCE(Resource); qmlBleMethod(); } bleWindow::~bleWindow() { delete ui; } void bleWindow::qmlBleMethod() { QQuickWidget *quickWidget = new QQuickWidget; quickWidget->setMinimumSize(this->minimumSize()); quickWidget->setMaximumSize(this->maximumSize()); quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); auto bleConnectionController = std::make_shared<BleConnectionController>(); auto bluetoothCommunication = std::make_shared<BluetoothCommunicationQT>(bleConnectionController); auto pumpController = std::make_shared<PumpController>(bluetoothCommunication); // View models BleConnectionViewModel *bleConnectionViewModel = new BleConnectionViewModel(bleConnectionController); BleCommunicationViewModel *bleCommunicationViewModel = new BleCommunicationViewModel(bluetoothCommunication); PumpControllerViewModel *pumpControllerViewModel = new PumpControllerViewModel(pumpController); // QQmlApplicationEngine engine; quickWidget->rootContext()->setContextProperty("bleConnectionViewModel", bleConnectionViewModel); quickWidget->rootContext()->setContextProperty("bleCommunicationViewModel", bleCommunicationViewModel); quickWidget->rootContext()->setContextProperty("pumpControllerViewModel", pumpControllerViewModel); quickWidget->setSource(QUrl("qrc:/ui/qml/customParentListView.qml")); QGridLayout *grid = new QGridLayout(); // grid->setMargin(10); grid->addWidget(quickWidget); ui->bleWidgetWindow->setLayout(grid); }
-
@eyllanesc I'm here to access SplineSeries chart to c++ object with pointer, Please find the reference
QML
SplineSeries{ id: _xySeries; axisX: _axisX; axisY: _axisY; width: 3 // color: Qt.rgba(0.918, 0.302, 0.247, 1) color: "black" style: Qt.SolidLine capStyle: Qt.FlatCap }
Component.onCompleted: { availableDeviceLabel.visible = false updateInfoLabel.visible = false if(true) { // console.info("ON COMPLETED TestCommunication") pumpControllerViewModel.heartRateGraph = _xySeries // console.info("!!!!!!!!!!!!!! SET Graph pointer !!!!!!!!!!!!!!!!") } else { // console.info("Graph pointer is not nullptr") } }
C++
#include "blewindow.h" #include "ui_blewindow.h" bleWindow::bleWindow(QWidget *parent) : QWidget(parent), ui(new Ui::bleWindow) { ui->setupUi(this); Q_INIT_RESOURCE(QML); Q_INIT_RESOURCE(Resource); qmlBleMethod(); } bleWindow::~bleWindow() { delete ui; } void bleWindow::qmlBleMethod() { QQuickWidget *quickWidget = new QQuickWidget; quickWidget->setMinimumSize(this->minimumSize()); quickWidget->setMaximumSize(this->maximumSize()); quickWidget->setResizeMode(QQuickWidget::SizeRootObjectToView); auto bleConnectionController = std::make_shared<BleConnectionController>(); auto bluetoothCommunication = std::make_shared<BluetoothCommunicationQT>(bleConnectionController); auto pumpController = std::make_shared<PumpController>(bluetoothCommunication); // View models BleConnectionViewModel *bleConnectionViewModel = new BleConnectionViewModel(bleConnectionController); BleCommunicationViewModel *bleCommunicationViewModel = new BleCommunicationViewModel(bluetoothCommunication); PumpControllerViewModel *pumpControllerViewModel = new PumpControllerViewModel(pumpController); // QQmlApplicationEngine engine; quickWidget->rootContext()->setContextProperty("bleConnectionViewModel", bleConnectionViewModel); quickWidget->rootContext()->setContextProperty("bleCommunicationViewModel", bleCommunicationViewModel); quickWidget->rootContext()->setContextProperty("pumpControllerViewModel", pumpControllerViewModel); quickWidget->setSource(QUrl("qrc:/ui/qml/customParentListView.qml")); QGridLayout *grid = new QGridLayout(); // grid->setMargin(10); grid->addWidget(quickWidget); ui->bleWidgetWindow->setLayout(grid); }
@balaji2830 You will understand that with that piece of code it is impossible to help you.
-
@eyllanesc I agree with what ur saying.
Actually, I have created the QML UI for BLE communication it working perfectly, but I'm creating those into a separate lib module I'm getting an error
qrc:/ui/qml/customParentListView.qml:717: Error: Cannot assign QObject* to an unregistered type
Here I'm sharing the QML SplineSeries to C++ Object, here where I'm getting the above error
-
@eyllanesc I agree with what ur saying.
Actually, I have created the QML UI for BLE communication it working perfectly, but I'm creating those into a separate lib module I'm getting an error
qrc:/ui/qml/customParentListView.qml:717: Error: Cannot assign QObject* to an unregistered type
Here I'm sharing the QML SplineSeries to C++ Object, here where I'm getting the above error
@balaji2830 show the PumpControllerViewModel class.
-
pumpcontrollerviewmodel.cpp
#include "pumpcontrollerviewmodel.h" PumpControllerViewModel::PumpControllerViewModel(QObject *parent) : QObject(parent) { heartRateGraphSeries = new QSplineSeries(); } PumpControllerViewModel::PumpControllerViewModel(std::shared_ptr<PumpController> controller) { pumpController = controller; heartRateGraphSeries = new QSplineSeries(); updateQSpline(); } QSplineSeries* PumpControllerViewModel::heartRateGraph() { // qDebug() << "PumpControllerViewModel-->heartRateGraph: READ"; return heartRateGraphSeries; } void PumpControllerViewModel::setHeartRateGraph(QSplineSeries* newHearRateGraph) { this->dumpObjectTree(); // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: begin"; if(heartRateGraphSeries == newHearRateGraph) { return; } if(heartRateGraphSeries) { if(heartRateGraphSeries->parent()){ // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: heartRateGraphSeries->parent() exists"; if(heartRateGraphSeries->parent() == this) { // is owner delete heartRateGraphSeries; heartRateGraphSeries = nullptr; qWarning() << "PumpControllerViewModel-->SetHeartRateGraph: Delete heartRateGraphSeries"; } } else { // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: heartRateGraphSeries->parent() does NOT EXIST!!"; } } heartRateGraphSeries = newHearRateGraph; updateQSpline(); // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: end"; } void PumpControllerViewModel::startPumping() { // qDebug() << "startPumping called"; pumpController->startPumping(); } void PumpControllerViewModel::stopPumping() { // qDebug() << "stopPumping called"; pumpController->stopPumping(); } void PumpControllerViewModel::setNewHeartRate(int newHeartRate) { pumpController->changeHeartRateTo(newHeartRate); // qDebug() << "Set new heart rate - " + QString::number(newHeartRate); updateQSpline(); } void PumpControllerViewModel::setNewPumpStrengthScaling(double newScaling) { // qDebug() << "Set new heart intensity - " + QString::number(newScaling); pumpController->changePumpStrengthScalingTo(newScaling); updateQSpline(); } void PumpControllerViewModel::setNewGraphShapeReal() { // qDebug() << "Real flow called"; pumpController->changeGraphShapeTo(SignalShape::REAL); updateQSpline(); } void PumpControllerViewModel::setNewGraphShapeRectangular() { // qDebug() << "Higher intensity flow called"; pumpController->changeGraphShapeTo(SignalShape::RECTANGULAR); updateQSpline(); } void PumpControllerViewModel::setNewGraphShapeRound() { // qDebug() << "Normal flow called"; pumpController->changeGraphShapeTo(SignalShape::ROUND); updateQSpline(); } void PumpControllerViewModel::resetPump() { pumpController->resetPumpBehavior(); updateQSpline(); } void PumpControllerViewModel::onQMLChartViewDestruction() { delete heartRateGraphSeries; heartRateGraphSeries = new QSplineSeries(); updateQSpline(); } void PumpControllerViewModel::updateQSpline() { heartRateGraphSeries->clear(); for(auto &graphPoint : pumpController->getFlowGraph()) { heartRateGraphSeries->append(graphPoint.time, graphPoint.flow); } emit heartRateGraphChanged(); }
PumpControllerViewModel .h
#ifndef PUMPCONTROLLERVIEWMODEL_H #define PUMPCONTROLLERVIEWMODEL_H #include <QObject> #include <QtCharts> #include <QSplineSeries> #include "pumpcontroller.h" class PumpControllerViewModel : public QObject { Q_OBJECT Q_PROPERTY(QSplineSeries* heartRateGraph READ heartRateGraph WRITE setHeartRateGraph NOTIFY heartRateGraphChanged) public: explicit PumpControllerViewModel(QObject *parent = nullptr); explicit PumpControllerViewModel(std::shared_ptr<PumpController> controller); QSplineSeries* heartRateGraph(); void setHeartRateGraph(QSplineSeries* newHearRateGraph); signals: void heartRateGraphChanged(); public slots: void startPumping(); void stopPumping(); void setNewHeartRate(int newHeartRate); void setNewPumpStrengthScaling(double newScaling); void setNewGraphShapeReal(); void setNewGraphShapeRectangular(); void setNewGraphShapeRound(); void resetPump(); void onQMLChartViewDestruction(); private: void updateQSpline(); std::shared_ptr<PumpController> pumpController; QSplineSeries* heartRateGraphSeries; }; #endif // PUMPCONTROLLERVIEWMODEL_H
-
pumpcontrollerviewmodel.cpp
#include "pumpcontrollerviewmodel.h" PumpControllerViewModel::PumpControllerViewModel(QObject *parent) : QObject(parent) { heartRateGraphSeries = new QSplineSeries(); } PumpControllerViewModel::PumpControllerViewModel(std::shared_ptr<PumpController> controller) { pumpController = controller; heartRateGraphSeries = new QSplineSeries(); updateQSpline(); } QSplineSeries* PumpControllerViewModel::heartRateGraph() { // qDebug() << "PumpControllerViewModel-->heartRateGraph: READ"; return heartRateGraphSeries; } void PumpControllerViewModel::setHeartRateGraph(QSplineSeries* newHearRateGraph) { this->dumpObjectTree(); // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: begin"; if(heartRateGraphSeries == newHearRateGraph) { return; } if(heartRateGraphSeries) { if(heartRateGraphSeries->parent()){ // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: heartRateGraphSeries->parent() exists"; if(heartRateGraphSeries->parent() == this) { // is owner delete heartRateGraphSeries; heartRateGraphSeries = nullptr; qWarning() << "PumpControllerViewModel-->SetHeartRateGraph: Delete heartRateGraphSeries"; } } else { // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: heartRateGraphSeries->parent() does NOT EXIST!!"; } } heartRateGraphSeries = newHearRateGraph; updateQSpline(); // qDebug() << "PumpControllerViewModel-->SetHeartRateGraph: end"; } void PumpControllerViewModel::startPumping() { // qDebug() << "startPumping called"; pumpController->startPumping(); } void PumpControllerViewModel::stopPumping() { // qDebug() << "stopPumping called"; pumpController->stopPumping(); } void PumpControllerViewModel::setNewHeartRate(int newHeartRate) { pumpController->changeHeartRateTo(newHeartRate); // qDebug() << "Set new heart rate - " + QString::number(newHeartRate); updateQSpline(); } void PumpControllerViewModel::setNewPumpStrengthScaling(double newScaling) { // qDebug() << "Set new heart intensity - " + QString::number(newScaling); pumpController->changePumpStrengthScalingTo(newScaling); updateQSpline(); } void PumpControllerViewModel::setNewGraphShapeReal() { // qDebug() << "Real flow called"; pumpController->changeGraphShapeTo(SignalShape::REAL); updateQSpline(); } void PumpControllerViewModel::setNewGraphShapeRectangular() { // qDebug() << "Higher intensity flow called"; pumpController->changeGraphShapeTo(SignalShape::RECTANGULAR); updateQSpline(); } void PumpControllerViewModel::setNewGraphShapeRound() { // qDebug() << "Normal flow called"; pumpController->changeGraphShapeTo(SignalShape::ROUND); updateQSpline(); } void PumpControllerViewModel::resetPump() { pumpController->resetPumpBehavior(); updateQSpline(); } void PumpControllerViewModel::onQMLChartViewDestruction() { delete heartRateGraphSeries; heartRateGraphSeries = new QSplineSeries(); updateQSpline(); } void PumpControllerViewModel::updateQSpline() { heartRateGraphSeries->clear(); for(auto &graphPoint : pumpController->getFlowGraph()) { heartRateGraphSeries->append(graphPoint.time, graphPoint.flow); } emit heartRateGraphChanged(); }
PumpControllerViewModel .h
#ifndef PUMPCONTROLLERVIEWMODEL_H #define PUMPCONTROLLERVIEWMODEL_H #include <QObject> #include <QtCharts> #include <QSplineSeries> #include "pumpcontroller.h" class PumpControllerViewModel : public QObject { Q_OBJECT Q_PROPERTY(QSplineSeries* heartRateGraph READ heartRateGraph WRITE setHeartRateGraph NOTIFY heartRateGraphChanged) public: explicit PumpControllerViewModel(QObject *parent = nullptr); explicit PumpControllerViewModel(std::shared_ptr<PumpController> controller); QSplineSeries* heartRateGraph(); void setHeartRateGraph(QSplineSeries* newHearRateGraph); signals: void heartRateGraphChanged(); public slots: void startPumping(); void stopPumping(); void setNewHeartRate(int newHeartRate); void setNewPumpStrengthScaling(double newScaling); void setNewGraphShapeReal(); void setNewGraphShapeRectangular(); void setNewGraphShapeRound(); void resetPump(); void onQMLChartViewDestruction(); private: void updateQSpline(); std::shared_ptr<PumpController> pumpController; QSplineSeries* heartRateGraphSeries; }; #endif // PUMPCONTROLLERVIEWMODEL_H
@balaji2830 I have created the following demo and I do not see the error you indicate:
#include "pumpcontrollerviewmodel.h" #include <QApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include <QTimer> int main(int argc, char *argv[]) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endif QApplication app(argc, argv); PumpControllerViewModel pumpControllerViewModel; QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("pumpControllerViewModel", &pumpControllerViewModel); const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); QTimer timer; QObject::connect(&timer, &QTimer::timeout, &pumpControllerViewModel, &PumpControllerViewModel::test); timer.start(); return app.exec(); }
#ifndef PUMPCONTROLLERVIEWMODEL_H #define PUMPCONTROLLERVIEWMODEL_H #include <QObject> #include <QPointer> #include <QSplineSeries> using namespace QtCharts; class PumpControllerViewModel : public QObject { Q_OBJECT Q_PROPERTY(QSplineSeries* heartRateGraph READ heartRateGraph WRITE setHeartRateGraph NOTIFY heartRateGraphChanged) public: explicit PumpControllerViewModel(QObject *parent = nullptr); QSplineSeries *heartRateGraph() const; void setHeartRateGraph(QSplineSeries *newHeartRateGraph); void test(); signals: void heartRateGraphChanged(); private: QPointer<QSplineSeries> m_heartRateGraph; }; #endif // PUMPCONTROLLERVIEWMODEL_H
#include "pumpcontrollerviewmodel.h" #include <QRandomGenerator> PumpControllerViewModel::PumpControllerViewModel(QObject *parent) : QObject(parent) { } QSplineSeries *PumpControllerViewModel::heartRateGraph() const { return m_heartRateGraph; } void PumpControllerViewModel::setHeartRateGraph(QSplineSeries *newHeartRateGraph) { if (m_heartRateGraph == newHeartRateGraph) return; m_heartRateGraph = newHeartRateGraph; emit heartRateGraphChanged(); } void PumpControllerViewModel::test() { if(m_heartRateGraph){ qreal x = QRandomGenerator::global()->bounded(5.0); qreal y = QRandomGenerator::global()->bounded(5.0); m_heartRateGraph->append(x, y); } }
import QtQuick 2.15 import QtQuick.Window 2.15 import QtCharts 2.15 Window { width: 640 height: 480 visible: true title: qsTr("Hello World") ChartView { title: "Spline" anchors.fill: parent antialiasing: true SplineSeries { id: _xySeries name: "SplineSeries" XYPoint { x: 0; y: 0.0 } XYPoint { x: 1.1; y: 3.2 } XYPoint { x: 1.9; y: 2.4 } XYPoint { x: 2.1; y: 2.1 } XYPoint { x: 2.9; y: 2.6 } XYPoint { x: 3.4; y: 2.3 } XYPoint { x: 4.1; y: 3.1 } XYPoint { x: 0; y: 0 } } } Component.onCompleted: pumpControllerViewModel.heartRateGraph = _xySeries }
-
I'm trying to make the BLE part has a separate static module (LIB) and integrating it into main executables, Everything linked correctly and works perfectly, but I'm getting the error, thanks for trying