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 move rows and update model

QTableView move rows and update model

Scheduled Pinned Locked Moved Solved General and Desktop
12 Posts 4 Posters 2.7k 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.
  • blackout69B Offline
    blackout69B Offline
    blackout69
    wrote on last edited by
    #1

    Hi all,
    With the following code, I can move the position of the lines in my QTableView

    void Gestione::show_item()
    {
      model = new QSqlTableModel(this);
      model->setTable("item");
      model->setHeaderData(1, Qt::Horizontal, tr("Number"));
      model->setHeaderData(2, Qt::Horizontal, tr("Name"));
      model->setHeaderData(3, Qt::Horizontal, tr("Email"));
      if (model->select())
        {
          ui->view_relatori->setModel(model);
          ui->view_relatori->resizeColumnsToContents();
          ui->view_relatori->verticalHeader()->setSectionsMovable(true);
          ui->view_relatori->verticalHeader()->setDragDropOverwriteMode(true);
          ui->view_relatori->verticalHeader()->setDragEnabled(true);
          ui->view_relatori->verticalHeader()->setDragDropMode(QAbstractItemView::InternalMove);
        }
    }
    

    Once I have ordered the list to my liking, I need to save the new order in the database table.
    I tried to read the data with a for loop, but I read from the model and not from the view

    void Gestione::read_data()
    {
      QStringList value_id;
      QStringList value_number;
      QVector<QStringList> current_order;
      current_order.clear();
      for(int i = 0; i < model->rowCount(); i++)
        {
          QSqlRecord record = model->record(i);
          value_id.append(record.value(0).toString());
          value_turno.append(record.value(1).toString());
          row = ui->view->verticalHeader()->visualIndex(i);
        }
      current_order.append(value_id_rel); // 00 List id_rel[]
      current_order.append(value_turno);  // 01 List Number[]
    }
    

    I searched for a solution, but found nothing.
    Is there a method to save the reordered view on the model?
    Thank you in advance
    blackout69

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

      Hi,

      Do you mean you want to be able to change the order of the database fields based on the visual changes you applied to the QTableView ?

      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
      • blackout69B Offline
        blackout69B Offline
        blackout69
        wrote on last edited by
        #3

        @sgaist said in QTableView move rows and update model:

        Do you mean you want to be able to change the order of the database fields based on the visual changes you applied to the QTableView ?

        Hi,
        Yes. The number field in the table serves as a "work shift". By changing the order in the view, I would like to update the table number field based on the new order. So that by applying a filter to the number field, I can always have the correct order in the view.

        blackout69

        JonBJ VRoninV 2 Replies Last reply
        0
        • blackout69B blackout69

          @sgaist said in QTableView move rows and update model:

          Do you mean you want to be able to change the order of the database fields based on the visual changes you applied to the QTableView ?

          Hi,
          Yes. The number field in the table serves as a "work shift". By changing the order in the view, I would like to update the table number field based on the new order. So that by applying a filter to the number field, I can always have the correct order in the view.

          blackout69

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #4

          @blackout69
          Since you are reordering via moving headers, you should perhaps read the answer in https://stackoverflow.com/questions/41807590/reading-qtableview-row-contents-with-the-same-order-as-are-seen-not-stored. Or, I think @VRonin's answer at https://forum.qt.io/topic/75393/reading-qtableview-row-contents-with-the-same-order-as-are-seen-not-stored/9 addresses your situation.

          Unless I am missing something (I am interested now), it does seems surprisingly complex to read table view row/columns in visual order instead of model order?

          blackout69B 1 Reply Last reply
          0
          • VRoninV Offline
            VRoninV Offline
            VRonin
            wrote on last edited by VRonin
            #5

            If you don't use the header to hide individual rows, you could try

            QObject::connect(ui->view_relatori->verticalHeader(),&QHeaderView::sectionMoved,[=](int logicalIndex, int oldVisualIndex, int newVisualIndex)->void{
            Q_ASSERT(logicalIndex==oldVisualIndex);
            const QModelIndex numberIndex =model->index(1,logicalIndex); /*I use 1 here because of model->setHeaderData(1, Qt::Horizontal, tr("Number")); it looks strange, however, you have nothing at index 0*/
            Q_ASSERT(logicalIndex==numberIndex.data().toInt());
            model->setData(numberIndex,newVisualIndex);
            });
            

            "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

            blackout69B 1 Reply Last reply
            1
            • JonBJ JonB

              @blackout69
              Since you are reordering via moving headers, you should perhaps read the answer in https://stackoverflow.com/questions/41807590/reading-qtableview-row-contents-with-the-same-order-as-are-seen-not-stored. Or, I think @VRonin's answer at https://forum.qt.io/topic/75393/reading-qtableview-row-contents-with-the-same-order-as-are-seen-not-stored/9 addresses your situation.

              Unless I am missing something (I am interested now), it does seems surprisingly complex to read table view row/columns in visual order instead of model order?

              blackout69B Offline
              blackout69B Offline
              blackout69
              wrote on last edited by
              #6

              @jonb
              reading based on the view would be great, but I don't know how. Could you tell me how?
              blackout69

              1 Reply Last reply
              0
              • VRoninV VRonin

                If you don't use the header to hide individual rows, you could try

                QObject::connect(ui->view_relatori->verticalHeader(),&QHeaderView::sectionMoved,[=](int logicalIndex, int oldVisualIndex, int newVisualIndex)->void{
                Q_ASSERT(logicalIndex==oldVisualIndex);
                const QModelIndex numberIndex =model->index(1,logicalIndex); /*I use 1 here because of model->setHeaderData(1, Qt::Horizontal, tr("Number")); it looks strange, however, you have nothing at index 0*/
                Q_ASSERT(logicalIndex==numberIndex.data().toInt());
                model->setData(numberIndex,newVisualIndex);
                });
                
                blackout69B Offline
                blackout69B Offline
                blackout69
                wrote on last edited by
                #7

                @vronin

                I get this when I move a row

                ASSERT: "logicalIndex==numberIndex.data().toInt()" in file gestione.cpp, line 843
                Invalid parameter passed to C runtime function.

                /I use 1 here because of model->setHeaderData(1, Qt::Horizontal, tr("Number")); it looks strange, however, you have nothing at index 0/
                My index 0 is the table id
                blackout69

                VRoninV 1 Reply Last reply
                0
                • blackout69B blackout69

                  @vronin

                  I get this when I move a row

                  ASSERT: "logicalIndex==numberIndex.data().toInt()" in file gestione.cpp, line 843
                  Invalid parameter passed to C runtime function.

                  /I use 1 here because of model->setHeaderData(1, Qt::Horizontal, tr("Number")); it looks strange, however, you have nothing at index 0/
                  My index 0 is the table id
                  blackout69

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

                  @blackout69 said in QTableView move rows and update model:

                  My index 0 is the table id

                  could you qDebug() << logicalIndex <<"!=" << numberIndex.data().toInt(); and post the result?

                  "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

                  blackout69B 1 Reply Last reply
                  0
                  • VRoninV VRonin

                    @blackout69 said in QTableView move rows and update model:

                    My index 0 is the table id

                    could you qDebug() << logicalIndex <<"!=" << numberIndex.data().toInt(); and post the result?

                    blackout69B Offline
                    blackout69B Offline
                    blackout69
                    wrote on last edited by
                    #9

                    @VRonin

                    QObject::connect(ui->view_relatori->verticalHeader(),&QHeaderView::sectionMoved,[=](int logicalIndex, int oldVisualIndex, int newVisualIndex)->void{
                    Q_ASSERT(logicalIndex == oldVisualIndex);
                    const QModelIndex numberIndex = relatori_model->index(rel_id_rel,logicalIndex); /*I use 1 here because of model->setHeaderData(1, Qt::Horizontal, tr("Number")); it looks strange, however, you have nothing at index 0*/
                    qDebug() << logicalIndex <<"!=" << numberIndex.data().toInt();
                    Q_ASSERT(logicalIndex == numberIndex.data().toInt());
                    relatori_model->setData(numberIndex,newVisualIndex);
                    });
                    

                    5 != 0
                    ASSERT: "logicalIndex == numberIndex.data().toInt()" in file gestione.cpp, line 844
                    Invalid parameter passed to C runtime function.
                    Invalid parameter passed to C runtime function.

                    blackout69

                    1 Reply Last reply
                    0
                    • blackout69B blackout69

                      @sgaist said in QTableView move rows and update model:

                      Do you mean you want to be able to change the order of the database fields based on the visual changes you applied to the QTableView ?

                      Hi,
                      Yes. The number field in the table serves as a "work shift". By changing the order in the view, I would like to update the table number field based on the new order. So that by applying a filter to the number field, I can always have the correct order in the view.

                      blackout69

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

                      @blackout69 said in QTableView move rows and update model:

                      The number field in the table serves as a "work shift"

                      Looks like it contains a 0 though. what is in that column

                      "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

                      blackout69B 2 Replies Last reply
                      0
                      • VRoninV VRonin

                        @blackout69 said in QTableView move rows and update model:

                        The number field in the table serves as a "work shift"

                        Looks like it contains a 0 though. what is in that column

                        blackout69B Offline
                        blackout69B Offline
                        blackout69
                        wrote on last edited by
                        #11

                        @vronin said in QTableView move rows and update model:

                        Looks like it contains a 0 though. what is in that column

                        In that column there is the table id. So only integers starting from 1
                        The table is thus formed:
                        id_rel int(11)
                        turno decimal(3,1)
                        name varchar(40)
                        email varchar(60)

                        blackout69

                        1 Reply Last reply
                        0
                        • VRoninV VRonin

                          @blackout69 said in QTableView move rows and update model:

                          The number field in the table serves as a "work shift"

                          Looks like it contains a 0 though. what is in that column

                          blackout69B Offline
                          blackout69B Offline
                          blackout69
                          wrote on last edited by
                          #12

                          @vronin
                          Perfect so it works.
                          Thanks for your help.

                                QObject::connect(ui->view_relatori->verticalHeader(), &QHeaderView::sectionMoved, [=](int logicalIndex, int oldVisualIndex, int newVisualIndex)->void{
                                Q_ASSERT(logicalIndex == oldVisualIndex);
                                QModelIndex numberIndex = relatori_model->index(logicalIndex, rel_turno);
                                Q_ASSERT(logicalIndex == numberIndex.data().toInt() - 1);
                                relatori_model->setData(numberIndex, newVisualIndex + 1);
                                relatori_model->submitAll();
                                });
                          

                          blackout69

                          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