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. QTableView Not Updating After Adding a New Row
Forum Updated to NodeBB v4.3 + New Features

QTableView Not Updating After Adding a New Row

Scheduled Pinned Locked Moved Unsolved General and Desktop
14 Posts 3 Posters 4.0k 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.
  • S Satish Joshi

    Hey Folks

    Hope you all are doing Well.

    I have through a lot of similar links regarding the issue which I am getting on the Table view. Here's the code with its explanation :

    // Declared on the header file
    QStandardItemModel* model;
    
    // Intialization on Constructor
        model = new QStandardItemModel(0,0,this);
    
    // Here's the logic behind the view which I am showing on QsubWindow
    tableView = new QTableView(this);
        tableView->setModel(model);
        tableView->verticalHeader()->setVisible(false);
        tableView->verticalHeader()->setDefaultSectionSize(10);
    
        for(int i = 0; i < clusterNames.length(); i++) {
            QStandardItem *clusterName_i = new QStandardItem(clusterNames[i]);
            QStandardItem *clusterIP_i = new QStandardItem(clusterIPs[i]);
    
            model->setItem(i, 0, clusterName_i);
            model->setItem(i, 1, clusterIP_i);
        }
    
        tableView->viewport()->update();
    
        splitter = new QSplitter(this);
        splitter->setOrientation(Qt::Horizontal);
        splitter->addWidget(hwTreeContainer);
        splitter->addWidget(tableView);
    
    // Then I used to display it on the window which is basically a QsubWindow.
    

    Explanation: The Logic behind this is I am populating a dialog on the window and adding the details which are used to show on the table view. After closing that particular Qdialog I noticed that the new row has not been added to the Table View but if I reopen the window I see the updated view with updated rows on the table view.

    The issue I am getting is that my Table View isn't updating automatically after adding or inserting the new data. But if I reopen the same window then I see the updated things.

    If anyone could help me regarding this would be a great help.

    Thanks in Advance

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

    @Satish-Joshi
    you initialize your model with no rows and no columns. Then you set the model to your view.
    The model never notifies the the view about a new row.

    so either you

    • initialize your model with the correct row & column count, or
    • call QStandardItemModel::insertRow() before your setItem() calls

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

    S 1 Reply Last reply
    1
    • MasterBLBM Offline
      MasterBLBM Offline
      MasterBLB
      wrote on last edited by
      #3

      void QStandardItemModel::appendRow(const QList<QStandardItem *> &items) is your friend Brother:

      for (int i = 0; i < clusterNames.length(); i++)
      {
          model->appendRow( { new QStandardItem(clusterNames[i]), new QStandardItem(clusterIPs[i]) } );
      }
      
      S 1 Reply Last reply
      0
      • raven-worxR raven-worx

        @Satish-Joshi
        you initialize your model with no rows and no columns. Then you set the model to your view.
        The model never notifies the the view about a new row.

        so either you

        • initialize your model with the correct row & column count, or
        • call QStandardItemModel::insertRow() before your setItem() calls
        S Offline
        S Offline
        Satish Joshi
        wrote on last edited by Satish Joshi
        #4

        @raven-worx

        First of all, Thank you so much for your time.

        As you mentioned that I am initializing the model with no rows and no columns. The reason behind it as I checked my model has updated data by debugging it but somehow it couldn't be able to show on the view.

        I also used QStandardItemModel::insertRow() in my code like this :

        model->insertRow(model->rowCount());
        
          for(int i = 0; i < clusterNames.length(); i++) {
              QStandardItem *clusterName_i = new QStandardItem(clusterNames[i]);
              QStandardItem *clusterIP_i = new QStandardItem(clusterIPs[i]);
        
              model->setItem(i, 0, clusterName_i);
              model->setItem(i, 1, clusterIP_i);
          }
        

        But sadly it didn't work or I am missing something. As I am calling the constructor of the current class (Where my logic has been there) after adding the new data which is in a different class of QDialog type. As I will share the glimpse of my QSubWindow type class constructor :

        HardwareDlg::HardwareDlg(QWidget *parent) :
            QMdiSubWindow(parent),
            ui(new Ui::HardwareDlg)
        {        
            this->setWindowTitle(HWWINDOW_NAME);
            this->resize(1200, 550);
        
            model = new QStandardItemModel(this);
        
            createActions();
            createMenus();
            newDeviceAct->setVisible(false);
            newDatagroupAct->setVisible(false);
            if (newMenu) {
                newMenu->setTitle("");
            }
        
            getClusterList();
            createStatusLabel();
            createMainView();  // This is the function which shows the data on table view and the main logic is written here
            createTreeView();
        }
        

        Also, I am attaching a screenshot so that it will briefer you :

        0_1561623982715_Cluster.png

        Please help me regarding this as I am stuck in this issue for like more than 2 days

        1 Reply Last reply
        0
        • MasterBLBM MasterBLB

          void QStandardItemModel::appendRow(const QList<QStandardItem *> &items) is your friend Brother:

          for (int i = 0; i < clusterNames.length(); i++)
          {
              model->appendRow( { new QStandardItem(clusterNames[i]), new QStandardItem(clusterIPs[i]) } );
          }
          
          S Offline
          S Offline
          Satish Joshi
          wrote on last edited by
          #5

          @MasterBLB

          Thank You so much for your time brother.

          But sadly it didn't work. Actually, I want the view to update automatically after adding the new row through a dialog box. As I can see the changes if I reopen the particular window again.

          Also, my model has the updated data but somehow I don't know why table view is not updating.

          Thanks

          raven-worxR 1 Reply Last reply
          0
          • MasterBLBM Offline
            MasterBLBM Offline
            MasterBLB
            wrote on last edited by MasterBLB
            #6

            Hmmm...try emit dataChanged(model->index(i, 0), model->index(i, 1), <maybe you'll have to pass 3rd parameter as well>) just after the line which adds new row.
            If that won't help then there are last resort methods - beginResetModel() before adding rows, and after completing add row operation endResetModel()
            Soo, merging my answers so far the output code would be:

            for (int i = 0; i < clusterNames.length(); i++)
            {
                model->appendRow( { new QStandardItem(clusterNames[i]), new QStandardItem(clusterIPs[i]) } );
                emit dataChanged(model->index(i, 0), model->index(i, 1));//maybe you'll have to pass 3rd parameter as well
            }
            
            S 1 Reply Last reply
            0
            • S Satish Joshi

              @MasterBLB

              Thank You so much for your time brother.

              But sadly it didn't work. Actually, I want the view to update automatically after adding the new row through a dialog box. As I can see the changes if I reopen the particular window again.

              Also, my model has the updated data but somehow I don't know why table view is not updating.

              Thanks

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

              @Satish-Joshi said in QTableView Not Updating After Adding a New Row:

              Actually, I want the view to update automatically after adding the new row through a dialog box.

              i explained why it doesnt update.
              What exactly have you tried?!

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

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

                @Satish-Joshi said in QTableView Not Updating After Adding a New Row:

                Actually, I want the view to update automatically after adding the new row through a dialog box.

                i explained why it doesnt update.
                What exactly have you tried?!

                S Offline
                S Offline
                Satish Joshi
                wrote on last edited by
                #8

                @raven-worx

                Yes I understand what you trying to explain and have used your suggested approach and
                I have used QStandardItemModel::insertRow(). But it didn't work.

                Thanks

                1 Reply Last reply
                0
                • MasterBLBM MasterBLB

                  Hmmm...try emit dataChanged(model->index(i, 0), model->index(i, 1), <maybe you'll have to pass 3rd parameter as well>) just after the line which adds new row.
                  If that won't help then there are last resort methods - beginResetModel() before adding rows, and after completing add row operation endResetModel()
                  Soo, merging my answers so far the output code would be:

                  for (int i = 0; i < clusterNames.length(); i++)
                  {
                      model->appendRow( { new QStandardItem(clusterNames[i]), new QStandardItem(clusterIPs[i]) } );
                      emit dataChanged(model->index(i, 0), model->index(i, 1));//maybe you'll have to pass 3rd parameter as well
                  }
                  
                  S Offline
                  S Offline
                  Satish Joshi
                  wrote on last edited by
                  #9

                  @MasterBLB

                  you mean to say QAbstractItemModel::dataChanged(.....) right?

                  I did it like this way :

                  // In header File
                  signals:
                      void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
                  
                  // On the Loop
                  emit model->dataChanged(model->index(i, 0), model->index(i, 1));
                  

                  Sorry but this time it also didn't work or I am missing something. Please let me know

                  Thanks

                  raven-worxR 1 Reply Last reply
                  0
                  • S Satish Joshi

                    @MasterBLB

                    you mean to say QAbstractItemModel::dataChanged(.....) right?

                    I did it like this way :

                    // In header File
                    signals:
                        void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
                    
                    // On the Loop
                    emit model->dataChanged(model->index(i, 0), model->index(i, 1));
                    

                    Sorry but this time it also didn't work or I am missing something. Please let me know

                    Thanks

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

                    @Satish-Joshi
                    you are not doing what i suggested.
                    Try this:

                    model = new QStandardItemModel(this);
                    model->setColumnCount( 2 );
                    //...
                    for(int i = 0; i < clusterNames.length(); i++)
                    {
                            QStandardItem *clusterName_i = new QStandardItem(clusterNames[i]);
                            QStandardItem *clusterIP_i = new QStandardItem(clusterIPs[i]);
                            model->appendRow( QList<QStandardItem*>() << clusterName_i << clusterIP_i );
                    }
                    

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

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

                      @Satish-Joshi
                      you are not doing what i suggested.
                      Try this:

                      model = new QStandardItemModel(this);
                      model->setColumnCount( 2 );
                      //...
                      for(int i = 0; i < clusterNames.length(); i++)
                      {
                              QStandardItem *clusterName_i = new QStandardItem(clusterNames[i]);
                              QStandardItem *clusterIP_i = new QStandardItem(clusterIPs[i]);
                              model->appendRow( QList<QStandardItem*>() << clusterName_i << clusterIP_i );
                      }
                      
                      S Offline
                      S Offline
                      Satish Joshi
                      wrote on last edited by Satish Joshi
                      #11

                      @raven-worx

                      Sorry. It didn't work though

                      I think there might be some issue with Widget or QSubWindow because as I already mentioned that the values are already updating on the model (checked through debugging it) but couldn't be displayed on the View.

                      As if I reopen the window it displays properly.

                      What do you think?

                      Thanks Anyway

                      1 Reply Last reply
                      0
                      • MasterBLBM Offline
                        MasterBLBM Offline
                        MasterBLB
                        wrote on last edited by MasterBLB
                        #12

                        Use that beginResetModel() and endResetModel() methods then, these makes a model completely invalidated, and therefore force a thorough update.

                        model->beginResetModel();
                        for (int i = 0; i < clusterNames.length(); i++)
                        {
                            model->appendRow( { new QStandardItem(clusterNames[i]), new QStandardItem(clusterIPs[i]) } );  
                        }
                        model->endResetModel();
                        
                        S 1 Reply Last reply
                        0
                        • MasterBLBM MasterBLB

                          Use that beginResetModel() and endResetModel() methods then, these makes a model completely invalidated, and therefore force a thorough update.

                          model->beginResetModel();
                          for (int i = 0; i < clusterNames.length(); i++)
                          {
                              model->appendRow( { new QStandardItem(clusterNames[i]), new QStandardItem(clusterIPs[i]) } );  
                          }
                          model->endResetModel();
                          
                          S Offline
                          S Offline
                          Satish Joshi
                          wrote on last edited by
                          #13

                          @MasterBLB

                          It seems both are protected members so can't access through it.

                          Thanks

                          1 Reply Last reply
                          0
                          • MasterBLBM Offline
                            MasterBLBM Offline
                            MasterBLB
                            wrote on last edited by
                            #14

                            Inherit QStandardItemModel, and declare public functions like beginReset() and endReset() whose internally invoke these protected methods.

                            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