Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. qmlregistered with c++
Forum Updated to NodeBB v4.3 + New Features

qmlregistered with c++

Scheduled Pinned Locked Moved Unsolved QML and Qt Quick
9 Posts 2 Posters 620 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    balaji2830
    wrote on last edited by
    #1

    Error: Cannot assign QObject* to an unregistered type

    Please Help me out with the error.

    eyllanescE 1 Reply Last reply
    0
    • B balaji2830

      Error: Cannot assign QObject* to an unregistered type

      Please Help me out with the error.

      eyllanescE Offline
      eyllanescE Offline
      eyllanesc
      wrote on last edited by
      #2

      @balaji2830 please provide a minimal and reproducible example.

      If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

      1 Reply Last reply
      0
      • B Offline
        B Offline
        balaji2830
        wrote on last edited by balaji2830
        #3

        @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);
        }
        
        
        eyllanescE 1 Reply Last reply
        0
        • B balaji2830

          @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);
          }
          
          
          eyllanescE Offline
          eyllanescE Offline
          eyllanesc
          wrote on last edited by
          #4

          @balaji2830 You will understand that with that piece of code it is impossible to help you.

          If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

          1 Reply Last reply
          1
          • B Offline
            B Offline
            balaji2830
            wrote on last edited by
            #5

            @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

            eyllanescE 1 Reply Last reply
            0
            • B balaji2830

              @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

              eyllanescE Offline
              eyllanescE Offline
              eyllanesc
              wrote on last edited by
              #6

              @balaji2830 show the PumpControllerViewModel class.

              If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

              1 Reply Last reply
              1
              • B Offline
                B Offline
                balaji2830
                wrote on last edited by balaji2830
                #7

                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
                
                
                eyllanescE 1 Reply Last reply
                0
                • B balaji2830

                  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
                  
                  
                  eyllanescE Offline
                  eyllanescE Offline
                  eyllanesc
                  wrote on last edited by
                  #8

                  @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
                  }
                  

                  If you want me to help you develop some work then you can write to my email: e.yllanescucho@gmal.com.

                  1 Reply Last reply
                  1
                  • B Offline
                    B Offline
                    balaji2830
                    wrote on last edited by
                    #9

                    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

                    1 Reply Last reply
                    0

                    • Login

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Categories
                    • Recent
                    • Tags
                    • Popular
                    • Users
                    • Groups
                    • Search
                    • Get Qt Extensions
                    • Unsolved