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. Dynamic Upadate of data to a ListModel
Forum Updated to NodeBB v4.3 + New Features

Dynamic Upadate of data to a ListModel

Scheduled Pinned Locked Moved QML and Qt Quick
37 Posts 4 Posters 13.9k Views 2 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.
  • saitejS Offline
    saitejS Offline
    saitej
    wrote on last edited by
    #1

    Hi

    I have a model very similar to this model.

    class DataList{
    public:
        DataList(const QString &name, const QString &value, const QString &category);
    
        QString name() const;
        QString value() const;
        QString category() const;
    
    private:
        QString m_name;
        QString m_value;
        QString m_category;
    };
    
    class DataModel : public QAbstractListModel
    {
        Q_OBJECT
    public:
        enum DataRoles {
            NameRole = Qt::UserRole + 1,
            ValueRole,
            CategoryRole
        };
    
        DataModel(QAbstractItemModel *parent = 0);
        virtual ~DataModel() {}
        void addData(const UAVDataList &uavdatalist);
        int rowCount(const QModelIndex & parent = QModelIndex()) const;
    
        QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
    protected:
        QHash<int, QByteArray> roleNames() const;
    
    private:
        QList<DataList> m_datalist;
    
    };
    

    Based on this, my model has 3 roles. The value variable in the DataList gets continuously updated and all value variables are Q_Property with well defined get, set and signals.

    I have attached this model in a listview. The listview shows only the initial values. How do I update the values when there is a change in the values?

    raven-worxR 1 Reply Last reply
    0
    • saitejS saitej

      Hi

      I have a model very similar to this model.

      class DataList{
      public:
          DataList(const QString &name, const QString &value, const QString &category);
      
          QString name() const;
          QString value() const;
          QString category() const;
      
      private:
          QString m_name;
          QString m_value;
          QString m_category;
      };
      
      class DataModel : public QAbstractListModel
      {
          Q_OBJECT
      public:
          enum DataRoles {
              NameRole = Qt::UserRole + 1,
              ValueRole,
              CategoryRole
          };
      
          DataModel(QAbstractItemModel *parent = 0);
          virtual ~DataModel() {}
          void addData(const UAVDataList &uavdatalist);
          int rowCount(const QModelIndex & parent = QModelIndex()) const;
      
          QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
      protected:
          QHash<int, QByteArray> roleNames() const;
      
      private:
          QList<DataList> m_datalist;
      
      };
      

      Based on this, my model has 3 roles. The value variable in the DataList gets continuously updated and all value variables are Q_Property with well defined get, set and signals.

      I have attached this model in a listview. The listview shows only the initial values. How do I update the values when there is a change in the values?

      raven-worxR Offline
      raven-worxR Offline
      raven-worx
      Moderators
      wrote on last edited by
      #2

      @saitej said in Dynamic Upadate of data to a ListModel:

      How do I update the values when there is a change in the values?

      you need to emit the dataChanged() signal from your model whenever the data for a given index changes.

      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
      If you have a question please use the forum so others can benefit from the solution in the future

      1 Reply Last reply
      0
      • m.sueM Offline
        m.sueM Offline
        m.sue
        wrote on last edited by
        #3

        Hi,
        ...or use the begin*, end* functions described in doc.qt.io/qt-5/qabstractitemmodel.html#protected-functions and e.g. used in this example http://doc.qt.io/qt-5/model-view-programming.html. This will probably result in calling the dataChanged() signal indirectly :-)
        -Michael.

        saitejS raven-worxR 2 Replies Last reply
        0
        • saitejS Offline
          saitejS Offline
          saitej
          wrote on last edited by
          #4

          Thanks!!

          I will try and update if it works

          1 Reply Last reply
          0
          • m.sueM m.sue

            Hi,
            ...or use the begin*, end* functions described in doc.qt.io/qt-5/qabstractitemmodel.html#protected-functions and e.g. used in this example http://doc.qt.io/qt-5/model-view-programming.html. This will probably result in calling the dataChanged() signal indirectly :-)
            -Michael.

            saitejS Offline
            saitejS Offline
            saitej
            wrote on last edited by
            #5

            @m.sue

            I am not adding a new row. I am only modifying a value so I guess datachanged() is a better choice.

            1 Reply Last reply
            0
            • m.sueM m.sue

              Hi,
              ...or use the begin*, end* functions described in doc.qt.io/qt-5/qabstractitemmodel.html#protected-functions and e.g. used in this example http://doc.qt.io/qt-5/model-view-programming.html. This will probably result in calling the dataChanged() signal indirectly :-)
              -Michael.

              raven-worxR Offline
              raven-worxR Offline
              raven-worx
              Moderators
              wrote on last edited by
              #6

              @m.sue said in Dynamic Upadate of data to a ListModel:

              This will probably result in calling the dataChanged() signal indirectly :-)

              actually no.
              The dataChanged() signal is for the case (surprise) when the data (of an existing item) has changed .
              The methods mentioned by you should be self-explanatory. So there is no dataChanged() signal necessary.

              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
              If you have a question please use the forum so others can benefit from the solution in the future

              saitejS 1 Reply Last reply
              0
              • m.sueM Offline
                m.sueM Offline
                m.sue
                wrote on last edited by
                #7

                @saitej: you had an addDatamethod, so I suspect you would really add some data.
                @raven-worx: Ah, I see, then they probably emit the \*AboutToBe\* signals, as somehow, of course, the widget must know about these actions.
                -Michael.

                saitejS raven-worxR 2 Replies Last reply
                0
                • m.sueM m.sue

                  @saitej: you had an addDatamethod, so I suspect you would really add some data.
                  @raven-worx: Ah, I see, then they probably emit the \*AboutToBe\* signals, as somehow, of course, the widget must know about these actions.
                  -Michael.

                  saitejS Offline
                  saitejS Offline
                  saitej
                  wrote on last edited by
                  #8

                  @m.sue

                  Ya for adddata method I am already using the beginInsertRows :)

                  1 Reply Last reply
                  0
                  • raven-worxR raven-worx

                    @m.sue said in Dynamic Upadate of data to a ListModel:

                    This will probably result in calling the dataChanged() signal indirectly :-)

                    actually no.
                    The dataChanged() signal is for the case (surprise) when the data (of an existing item) has changed .
                    The methods mentioned by you should be self-explanatory. So there is no dataChanged() signal necessary.

                    saitejS Offline
                    saitejS Offline
                    saitej
                    wrote on last edited by
                    #9

                    @raven-worx

                    Hi

                    I didn't get you. If I need to change the existing data, how do i do it with out datachanged() signal

                    1 Reply Last reply
                    0
                    • m.sueM m.sue

                      @saitej: you had an addDatamethod, so I suspect you would really add some data.
                      @raven-worx: Ah, I see, then they probably emit the \*AboutToBe\* signals, as somehow, of course, the widget must know about these actions.
                      -Michael.

                      raven-worxR Offline
                      raven-worxR Offline
                      raven-worx
                      Moderators
                      wrote on last edited by
                      #10

                      @m.sue said in Dynamic Upadate of data to a ListModel:

                      Ah, I see, then they probably emit the *AboutToBe* signals, as somehow, of course, the widget must know about these actions.

                      yes, the QAbstractItemView of course does connect to those signals. If you have a custom object/widget, you would also need to connect to those signals.

                      @saitej said in Dynamic Upadate of data to a ListModel:

                      I didn't get you. If I need to change the existing data, how do i do it with out datachanged() signal

                      i said: you only need in the case existing data has changed

                      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                      If you have a question please use the forum so others can benefit from the solution in the future

                      saitejS 1 Reply Last reply
                      0
                      • raven-worxR raven-worx

                        @m.sue said in Dynamic Upadate of data to a ListModel:

                        Ah, I see, then they probably emit the *AboutToBe* signals, as somehow, of course, the widget must know about these actions.

                        yes, the QAbstractItemView of course does connect to those signals. If you have a custom object/widget, you would also need to connect to those signals.

                        @saitej said in Dynamic Upadate of data to a ListModel:

                        I didn't get you. If I need to change the existing data, how do i do it with out datachanged() signal

                        i said: you only need in the case existing data has changed

                        saitejS Offline
                        saitejS Offline
                        saitej
                        wrote on last edited by
                        #11

                        @raven-worx

                        void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ())
                        

                        Is this used to update the entire model or Can it be used to update a specific item in the listview? If It can be used to update a specific item then what are the arguments (instead of bootrom right)?

                        Thanks!!

                        raven-worxR 1 Reply Last reply
                        0
                        • saitejS saitej

                          @raven-worx

                          void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int> ())
                          

                          Is this used to update the entire model or Can it be used to update a specific item in the listview? If It can be used to update a specific item then what are the arguments (instead of bootrom right)?

                          Thanks!!

                          raven-worxR Offline
                          raven-worxR Offline
                          raven-worx
                          Moderators
                          wrote on last edited by raven-worx
                          #12

                          @saitej
                          if it's just a single cell, then topLeft and bottomRight are the same index.
                          If you want to update the whole row, then topLeft is QModelIndex(row,0) and bottomRight is QModelIndex(row,colCount-1).
                          Also it is possible to set topLeft to QModelIndex(0,0) and bottomRight to QModelIndex(rowCount-1,colCount-1) to update the whole table/list.

                          Note that ranges are only supported when topLeft and bottomRight have the same parent index. So as long as you don't use your model in a treeview your are fine.

                          --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                          If you have a question please use the forum so others can benefit from the solution in the future

                          saitejS 2 Replies Last reply
                          1
                          • raven-worxR raven-worx

                            @saitej
                            if it's just a single cell, then topLeft and bottomRight are the same index.
                            If you want to update the whole row, then topLeft is QModelIndex(row,0) and bottomRight is QModelIndex(row,colCount-1).
                            Also it is possible to set topLeft to QModelIndex(0,0) and bottomRight to QModelIndex(rowCount-1,colCount-1) to update the whole table/list.

                            Note that ranges are only supported when topLeft and bottomRight have the same parent index. So as long as you don't use your model in a treeview your are fine.

                            saitejS Offline
                            saitejS Offline
                            saitej
                            wrote on last edited by
                            #13

                            @raven-worx

                            Thanks a lot!!

                            1 Reply Last reply
                            0
                            • raven-worxR raven-worx

                              @saitej
                              if it's just a single cell, then topLeft and bottomRight are the same index.
                              If you want to update the whole row, then topLeft is QModelIndex(row,0) and bottomRight is QModelIndex(row,colCount-1).
                              Also it is possible to set topLeft to QModelIndex(0,0) and bottomRight to QModelIndex(rowCount-1,colCount-1) to update the whole table/list.

                              Note that ranges are only supported when topLeft and bottomRight have the same parent index. So as long as you don't use your model in a treeview your are fine.

                              saitejS Offline
                              saitejS Offline
                              saitej
                              wrote on last edited by saitej
                              #14

                              @raven-worx

                              Hi

                              I am trying to connect a property change signal to datachanged signal through the following code.

                              for(int i=0;i<model.rowCount();i++)
                                  {
                                       if(model.data(model.index(i),UAVDataModel::NameRole).toString() == "Initial Polygon Area" ){
                                           connect(&av1,SIGNAL(initialPolygonAreaChanged(qreal)),&model,SIGNAL(dataChanged(model.index(i),model.index(i))));
                                       }
                              
                                  }
                              

                              I am getting an error

                              QObject::connect: No such signal DataModel::dataChanged(model.index(i),model.index(i))

                              Note: I have not redeclared the signal in the model as it is inherited from QAbstractListModel

                              raven-worxR 1 Reply Last reply
                              0
                              • saitejS saitej

                                @raven-worx

                                Hi

                                I am trying to connect a property change signal to datachanged signal through the following code.

                                for(int i=0;i<model.rowCount();i++)
                                    {
                                         if(model.data(model.index(i),UAVDataModel::NameRole).toString() == "Initial Polygon Area" ){
                                             connect(&av1,SIGNAL(initialPolygonAreaChanged(qreal)),&model,SIGNAL(dataChanged(model.index(i),model.index(i))));
                                         }
                                
                                    }
                                

                                I am getting an error

                                QObject::connect: No such signal DataModel::dataChanged(model.index(i),model.index(i))

                                Note: I have not redeclared the signal in the model as it is inherited from QAbstractListModel

                                raven-worxR Offline
                                raven-worxR Offline
                                raven-worx
                                Moderators
                                wrote on last edited by
                                #15

                                @saitej
                                thats not how signal/slot connections work.
                                Rather you should connect the model's dataChanged() signal to a slot of yours, and in the slot check the passed index if it's the row/column you want.

                                --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                                If you have a question please use the forum so others can benefit from the solution in the future

                                saitejS 1 Reply Last reply
                                0
                                • raven-worxR raven-worx

                                  @saitej
                                  thats not how signal/slot connections work.
                                  Rather you should connect the model's dataChanged() signal to a slot of yours, and in the slot check the passed index if it's the row/column you want.

                                  saitejS Offline
                                  saitejS Offline
                                  saitej
                                  wrote on last edited by
                                  #16

                                  @raven-worx

                                  I am not editing the data, it is only displaying data from a source. So connecting datachanged signal to a slot does not make sense.

                                  we can use connect() to connect 2 signals right?

                                  raven-worxR 1 Reply Last reply
                                  0
                                  • saitejS saitej

                                    @raven-worx

                                    I am not editing the data, it is only displaying data from a source. So connecting datachanged signal to a slot does not make sense.

                                    we can use connect() to connect 2 signals right?

                                    raven-worxR Offline
                                    raven-worxR Offline
                                    raven-worx
                                    Moderators
                                    wrote on last edited by
                                    #17

                                    @saitej said in Dynamic Upadate of data to a ListModel:

                                    So connecting datachanged signal to a slot does not make sense.

                                    sorry but that doesn't make sense. I think you still don't understand the concept.
                                    It doesn't matter if you edit the data or not.

                                    The dataChanged() signal notifies the receiver (-> slot) that the data of the given index(es) has changed, and the data needs to be retrieved from the model again.

                                    --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                                    If you have a question please use the forum so others can benefit from the solution in the future

                                    saitejS 1 Reply Last reply
                                    0
                                    • raven-worxR raven-worx

                                      @saitej said in Dynamic Upadate of data to a ListModel:

                                      So connecting datachanged signal to a slot does not make sense.

                                      sorry but that doesn't make sense. I think you still don't understand the concept.
                                      It doesn't matter if you edit the data or not.

                                      The dataChanged() signal notifies the receiver (-> slot) that the data of the given index(es) has changed, and the data needs to be retrieved from the model again.

                                      saitejS Offline
                                      saitejS Offline
                                      saitej
                                      wrote on last edited by
                                      #18

                                      @raven-worx

                                      I got what datachanged signal does. I would like to explain my problem better. Sorry for the inconvenience.

                                      For ex:
                                      I have a signal initialPolygonAreaChanged(qreal) emitted when ever initialPolygonArea is changed . I know the index of initialPolygonArea in the model. I need to connect the initialPolygonAreaChanged(qreal) with datachanged() signal. Is this the right way?

                                      raven-worxR 1 Reply Last reply
                                      0
                                      • saitejS saitej

                                        @raven-worx

                                        I got what datachanged signal does. I would like to explain my problem better. Sorry for the inconvenience.

                                        For ex:
                                        I have a signal initialPolygonAreaChanged(qreal) emitted when ever initialPolygonArea is changed . I know the index of initialPolygonArea in the model. I need to connect the initialPolygonAreaChanged(qreal) with datachanged() signal. Is this the right way?

                                        raven-worxR Offline
                                        raven-worxR Offline
                                        raven-worx
                                        Moderators
                                        wrote on last edited by raven-worx
                                        #19

                                        @saitej said in Dynamic Upadate of data to a ListModel:

                                        Is this the right way?

                                        so far so good. You can also emit the dataChanged() signal whenever you emit initialPolygonAreaChanged(), since you know the index. (If the initialPolygonAreaChanged() signal is defined in the model)

                                        --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                                        If you have a question please use the forum so others can benefit from the solution in the future

                                        saitejS 1 Reply Last reply
                                        0
                                        • raven-worxR raven-worx

                                          @saitej said in Dynamic Upadate of data to a ListModel:

                                          Is this the right way?

                                          so far so good. You can also emit the dataChanged() signal whenever you emit initialPolygonAreaChanged(), since you know the index. (If the initialPolygonAreaChanged() signal is defined in the model)

                                          saitejS Offline
                                          saitejS Offline
                                          saitej
                                          wrote on last edited by
                                          #20

                                          @raven-worx

                                          It is not defined in the model so I was to trying to connect via this:

                                          connect(&av1,SIGNAL(initialPolygonAreaChanged(qreal)),&model,SIGNAL(dataChanged(model.index(i),model.index(i))));

                                          What should this be changed to?

                                          raven-worxR 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