Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to modify the data in the model and update the view when new data is received from external?
Forum Updated to NodeBB v4.3 + New Features

How to modify the data in the model and update the view when new data is received from external?

Scheduled Pinned Locked Moved Solved General and Desktop
76 Posts 4 Posters 50.8k 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.
  • VRoninV VRonin

    @VInay123 said in How to modify the data in the model and update the view when new data is received from external?:

    One way i see is to save the row as member variable while creating the parent.

    It's one way but usually it becomes unmanageable if you implement insert/remove/moveRows

    You can always traverse categories_ to find the index of parentItem

    ? Offline
    ? Offline
    A Former User
    wrote on last edited by A Former User
    #43

    @VRonin: So now the test is running error free. This was the implementation i had to make:

    QModelIndex Model::parent(const QModelIndex& index) const {
        if (!index.isValid()) {
            return QModelIndex();
        }
    
        if (isCategory(index)) {
            return QModelIndex();
        }
    
        const auto currentItem = static_cast<ScenarioPropertyItem*>(index.internalPointer());
        CategoryItem* parentItem = currentItem->parentItem();
        int rowNum = categories_.size();
        for (int i = 0; i < rowNum; i++) {
            if (categories_.at(i)->displayName() == parentItem->displayName()) {
                rowNum = i;
            }
        }
        return createIndex(rowNum, 0, parentItem);
    }
    

    But the view is still not displaying the new values. :( This is how i update the value

        QModelIndex index = createIndex(1, 1, categories_[0]->entryAt(0));
        this->setData(index, 11, Qt::EditRole);
    

    My SetData:

    bool Model::setData(const QModelIndex& index, const QVariant& value, int role /*= Qt::EditRole*/) {
        if (role == Qt::EditRole && index.column() == 1 && index.isValid()) {
            auto currentItem = static_cast<ScenarioPropertyItem*>(index.internalPointer());
            if (currentItem) {
                currentItem->setValue(value);
                emit dataChanged(index, index);
                return true;
            }
        }
        return false;
    }
    
    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by VRonin
      #44

      @VInay123 said in How to modify the data in the model and update the view when new data is received from external?:

      But the view is still not displaying the new values

      Does the view display the old values or is it completely empty? is currentItem null?

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      ? 1 Reply Last reply
      0
      • VRoninV VRonin

        @VInay123 said in How to modify the data in the model and update the view when new data is received from external?:

        But the view is still not displaying the new values

        Does the view display the old values or is it completely empty? is currentItem null?

        ? Offline
        ? Offline
        A Former User
        wrote on last edited by A Former User
        #45

        @VRonin: I initialize the model data i.e. categories_ with empty values. So the view shows empty value. But i update the value in my function and in debug mode i see the new value in the variable but the view shows empty i.e. old value. If i change the property to write mode, via delegate the value is being changed and view displays correctly. But when i do as following it does not:

            QModelIndex index = createIndex(1, 1, categories_[0]->entryAt(0));
            this->setData(index, 11, Qt::EditRole);
        

        It actually calls the setData too and emits dataChanged. But the view is not displaying. Just for info my index method looks like this:

        QModelIndex Model::index(int row, int column, const QModelIndex& parent /*= QModelIndex()*/) const {
            if (!hasIndex(row, column, parent)) {
                return QModelIndex();
            }
        
            if (!parent.isValid()) {
                return createIndex(row, column, categories_.at(row).get());
            }
        
            const auto currentCategory = static_cast<CategoryItem*>(parent.internalPointer());
            ScenarioPropertyItem* currentItem = currentCategory->entryAt(row);
        
            if (currentItem) {
                return createIndex(row, column, currentItem);
            } else {
                return QModelIndex();
            }
        }
        
        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #46

          What version of Qt are you on?
          Usually the view ignores the dataChanged if it thinks the cell pointed by index shouldn't exist

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          ? 1 Reply Last reply
          0
          • VRoninV VRonin

            What version of Qt are you on?
            Usually the view ignores the dataChanged if it thinks the cell pointed by index shouldn't exist

            ? Offline
            ? Offline
            A Former User
            wrote on last edited by A Former User
            #47

            @VRonin : I use Qt5.9.0. The update should have been this

                QModelIndex index = createIndex(0, 1, categories_[0]->entryAt(0)); // but not 1,1
                this->setData(index, 11, Qt::EditRole);
            

            But even then after the above change its not updating. Actually in setData there is already a index.isValid() check. The indexes looks good and also the currentItem. Should i post my model and view once again after the new changes i have done?

            VRoninV 1 Reply Last reply
            0
            • ? A Former User

              @VRonin : I use Qt5.9.0. The update should have been this

                  QModelIndex index = createIndex(0, 1, categories_[0]->entryAt(0)); // but not 1,1
                  this->setData(index, 11, Qt::EditRole);
              

              But even then after the above change its not updating. Actually in setData there is already a index.isValid() check. The indexes looks good and also the currentItem. Should i post my model and view once again after the new changes i have done?

              VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by
              #48

              @VInay123 said in How to modify the data in the model and update the view when new data is received from external?:

              Actually in setData there is already a index.isValid() check.

              index.isValid() is an insufficient check, that's why checkIndex was introduced in Qt 5.11

              The indexes looks good and also the currentItem.

              Unfortunately sometimes that's not enough. For example, if you forget to signal the view that you inserted a row, and then emit dataChanged for an item in that row, even if the item is 100% valid in the model the view will still think the row doesn't exist and do nothing

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              1 Reply Last reply
              1
              • ? Offline
                ? Offline
                A Former User
                wrote on last edited by
                #49

                @JonB @VRonin @SGaist : Something is not seeming right. I tried first to change the value using the following:

                QModelIndex index = createIndex(0, 1, categories_[0]->entryAt(0));
                    this->setData(index, 11, Qt::EditRole);
                

                And in delegate class i tried to see what the value it has but it looks like it is zero. Below is the implementation:

                QWidget *PropertyEditorItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
                    if (!index.isValid()) {
                        return nullptr;
                    } else if (index.column() == 0) {
                        return QStyledItemDelegate::createEditor(parent, option, index);
                    }
                
                    const auto currentItem = static_cast<ScenarioPropertyItem *>(index.internalPointer());
                    switch (currentItem->itemType()) {
                        case PropertyType::DOUBLE: {
                            QDoubleSpinBox *box = new QDoubleSpinBox(parent);
                            auto v = currentItem->data(index.column()); // Here it is zero??? :(
                            box->setValue(v.toDouble());
                            return box;  // qt will handle deletion
                        }
                default:
                            return QStyledItemDelegate::createEditor(parent, option, index);
                    }
                }
                
                1 Reply Last reply
                0
                • VRoninV Offline
                  VRoninV Offline
                  VRonin
                  wrote on last edited by
                  #50

                  In setData could you add the qDebug as below and tell us what is printed?

                  if (currentItem) {
                             currentItem->setValue(value);
                  qDebug() << currentItem->data(1);
                  qDebug() << index.data(Qt::DisplayRole);
                               emit dataChanged(index, index);
                               return true;
                          }
                  

                  "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                  ~Napoleon Bonaparte

                  On a crusade to banish setIndexWidget() from the holy land of Qt

                  ? 1 Reply Last reply
                  0
                  • VRoninV VRonin

                    In setData could you add the qDebug as below and tell us what is printed?

                    if (currentItem) {
                               currentItem->setValue(value);
                    qDebug() << currentItem->data(1);
                    qDebug() << index.data(Qt::DisplayRole);
                                 emit dataChanged(index, index);
                                 return true;
                            }
                    
                    ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by A Former User
                    #51

                    @VRonin :

                    [16:56:03,236] [Debug] QVariant(int, 11) / My new values
                    [16:56:03,237] [Debug] QVariant(int, 11) // My new values
                    

                    ;(
                    When i change via delegate:

                    [16:58:06,173] [Debug] QVariant(double, 0)
                    [16:58:06,176] [Debug] QVariant(double, 0)
                    

                    I believe somewhere the indexes are not right. When i try to change the value(via delegate) of suppose "T" value so that i can iterate over parent and see the "S" value, here it is empty, but should be 11.

                    1 Reply Last reply
                    0
                    • ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by A Former User
                      #52

                      My model looks like this:
                      0_1535729444022_model1.PNG
                      0_1535729450658_model2.PNG

                      In parent method i use pointer for parent item but not reference.

                      1 Reply Last reply
                      0
                      • ? Offline
                        ? Offline
                        A Former User
                        wrote on last edited by
                        #53

                        @VRonin @SGaist @JonB : I just debugged to see that after changing the value of the property via delegate does the index in the following code has the same value.

                        QModelIndex index = createIndex(0, 1, categories_.at(0)->entryAt(0));
                            this->setData(index, 11, Qt::EditRole);
                        

                        But it turns out that the index in the above is just a copy and when delegate changes the value it is not reflected in the index here. I think i am changing at a copy of the property but not the actual one.

                        1 Reply Last reply
                        0
                        • ? Offline
                          ? Offline
                          A Former User
                          wrote on last edited by
                          #54
                          This post is deleted!
                          1 Reply Last reply
                          0
                          • VRoninV Offline
                            VRoninV Offline
                            VRonin
                            wrote on last edited by
                            #55

                            Can you show us the code for Delegate::setModelData?

                            "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                            ~Napoleon Bonaparte

                            On a crusade to banish setIndexWidget() from the holy land of Qt

                            ? 1 Reply Last reply
                            0
                            • VRoninV VRonin

                              Can you show us the code for Delegate::setModelData?

                              ? Offline
                              ? Offline
                              A Former User
                              wrote on last edited by
                              #56

                              @VRonin

                               void PropertyEditorItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
                                      const auto currentItem = static_cast<ScenarioPropertyItem *>(index.internalPointer());
                              
                                      auto setup = [this, &model, &index](auto editor, auto usage) {
                                          if (editor) {
                                              usage(editor);
                                          } else {
                                              QStyledItemDelegate::setModelData(editor, model, index);
                                          }
                                      };
                              
                                      switch (currentItem->itemType()) {
                                          case PropertyType::DOUBLE: {
                                              setup(qobject_cast<QDoubleSpinBox *>(editor), [&index, &model](QDoubleSpinBox *editor) {
                                                  editor->interpretText();
                                                  model->setData(index, editor->value(), Qt::EditRole);
                                              });
                                              break;
                                          }
                                          case PropertyType::INTEGER: {
                                              setup(qobject_cast<QSpinBox *>(editor), [&index, &model](QSpinBox *editor) {
                                                  editor->interpretText();
                                                  model->setData(index, editor->value(), Qt::EditRole);
                                              });
                                              break;
                                          }
                                          case PropertyType::STRING: {
                                              setup(qobject_cast<QLineEdit *>(editor), [&index, &model](QLineEdit *editor) { model->setData(index, editor->text(), Qt::EditRole); });
                                              break;
                                          }
                                          case PropertyType::BOOLEAN: {
                                              setup(qobject_cast<QComboBox *>(editor),
                                                    [this, &index, &model](QComboBox *editor) { model->setData(index, editor->currentText(), Qt::EditRole); });
                                              break;
                                          }
                                          default:
                                              QStyledItemDelegate::setModelData(editor, model, index);
                                              break;
                                      }
                                  }
                              
                              1 Reply Last reply
                              0
                              • ? Offline
                                ? Offline
                                A Former User
                                wrote on last edited by A Former User
                                #57
                                This post is deleted!
                                1 Reply Last reply
                                0
                                • SGaistS Offline
                                  SGaistS Offline
                                  SGaist
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #58

                                  Why are you calling createIndex in onRefreshRoadInfo ?

                                  Interested in AI ? www.idiap.ch
                                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                  ? 1 Reply Last reply
                                  0
                                  • SGaistS SGaist

                                    Why are you calling createIndex in onRefreshRoadInfo ?

                                    ? Offline
                                    ? Offline
                                    A Former User
                                    wrote on last edited by A Former User
                                    #59

                                    @SGaist In onRefereshRoadInfo function i get the new values which has to be shown in the view. So, here I want to update the values, and as i dont have the index's, i create index for every property and call setData to update the values. If this is not correct how should i update the values here?

                                    1 Reply Last reply
                                    0
                                    • ? Offline
                                      ? Offline
                                      A Former User
                                      wrote on last edited by
                                      #60

                                      @JonB @SGaist @VRonin : Any lead for my problem?

                                      1 Reply Last reply
                                      0
                                      • SGaistS Offline
                                        SGaistS Offline
                                        SGaist
                                        Lifetime Qt Champion
                                        wrote on last edited by
                                        #61

                                        Please show more patience, allow at least 24 hours before bumping your own thread. People answering on this forum do it on a voluntary basis and might not live in the same time zone as you.

                                        That said, I stumble upon the QJsonModel project. You might want to check it.

                                        Interested in AI ? www.idiap.ch
                                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        ? 1 Reply Last reply
                                        3
                                        • SGaistS SGaist

                                          Please show more patience, allow at least 24 hours before bumping your own thread. People answering on this forum do it on a voluntary basis and might not live in the same time zone as you.

                                          That said, I stumble upon the QJsonModel project. You might want to check it.

                                          ? Offline
                                          ? Offline
                                          A Former User
                                          wrote on last edited by
                                          #62

                                          @SGaist I will keep in mind :). I saw the project and looks like my current implementation looks but, the project does not have the one thing i am looking for i.e. updating of data inside the code i.e. onRefereshRoadInfo.

                                          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