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. Copy selected rows of a table to a model

Copy selected rows of a table to a model

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 3 Posters 6.1k Views
  • 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.
  • dheerendraD Offline
    dheerendraD Offline
    dheerendra
    Qt Champions 2022
    wrote on last edited by
    #5

    QModelIndex are transient and don't try to use them in some other model. Problem may be because you are inserting the same index. It is better you fetch the value from the model and build items and then insert the same in other model.

    Dheerendra
    @Community Service
    Certified Qt Specialist
    http://www.pthinks.com

    1 Reply Last reply
    3
    • P Offline
      P Offline
      Panoss
      wrote on last edited by Panoss
      #6
      This post is deleted!
      1 Reply Last reply
      0
      • P Offline
        P Offline
        Panoss
        wrote on last edited by Panoss
        #7

        I create a QStandardItem . How do I insert it in selected_rows_model?

        QItemSelectionModel *selectionModel = ui.devices_finder_tbl->selectionModel();
        
        QModelIndexList list = selectionModel->selectedRows();
        
        for(int i = 0; i < list.size(); i++)
        {
          QModelIndex index = list.at(i);
          QStandardItem  *qsti = new QStandardItem(index.data().toString());
          selected_rows_model->???
        }
        
        1 Reply Last reply
        0
        • dheerendraD Offline
          dheerendraD Offline
          dheerendra
          Qt Champions 2022
          wrote on last edited by
          #8

          use setItem(int row, int column, QStandardItem *item) method.

          Dheerendra
          @Community Service
          Certified Qt Specialist
          http://www.pthinks.com

          1 Reply Last reply
          3
          • P Offline
            P Offline
            Panoss
            wrote on last edited by Panoss
            #9

            As row I use the rowCount().

            row = selected_rows_model->rowCount();
            selected_rows_model->setItem(row, column, qsti);
            

            But as column? What should I use?

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

              Again, you don't need a new model, you need a proxy. While I still suggest KSelectionProxyModel (it's super easy to build with cmake and link) an alternative way is:

              const int selectedRole = Qt::UserRole + 124;
              connect(ui.devices_finder_tbl->selectionModel(),&QItemSelectionModel::selectionChanged,[=](const QItemSelection &selected, const QItemSelection &deselected)->void{
              const QModelIndexList selectedIdx = selected.indexes();
              const QModelIndexList deselectedIdx = deselected.indexes();
              for(const QModelIndex& singleIdx : selectedIdx)
              ui.devices_finder_tbl->model()->setData(ui.devices_finder_tbl->model()->index(singleIdx.row(),0,singleIdx.parent()),1,selectedRole);
              for(const QModelIndex& singleIdx : deselectedIdx )
              ui.devices_finder_tbl->model()->setData(ui.devices_finder_tbl->model()->index(singleIdx.row(),0,singleIdx.parent()),QVariant(),selectedRole);
              });
              
              QSortFilterProxyModel* selected_rows_model=new QSortFilterProxyModel(this);
              selected_rows_model->setFilterRole(selectedRole);
              selected_rows_model->setFilterFixedString("1");
              selected_rows_model->setsourceModel(ui.devices_finder_tbl->model());
              

              "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

              P 1 Reply Last reply
              1
              • VRoninV VRonin

                Again, you don't need a new model, you need a proxy. While I still suggest KSelectionProxyModel (it's super easy to build with cmake and link) an alternative way is:

                const int selectedRole = Qt::UserRole + 124;
                connect(ui.devices_finder_tbl->selectionModel(),&QItemSelectionModel::selectionChanged,[=](const QItemSelection &selected, const QItemSelection &deselected)->void{
                const QModelIndexList selectedIdx = selected.indexes();
                const QModelIndexList deselectedIdx = deselected.indexes();
                for(const QModelIndex& singleIdx : selectedIdx)
                ui.devices_finder_tbl->model()->setData(ui.devices_finder_tbl->model()->index(singleIdx.row(),0,singleIdx.parent()),1,selectedRole);
                for(const QModelIndex& singleIdx : deselectedIdx )
                ui.devices_finder_tbl->model()->setData(ui.devices_finder_tbl->model()->index(singleIdx.row(),0,singleIdx.parent()),QVariant(),selectedRole);
                });
                
                QSortFilterProxyModel* selected_rows_model=new QSortFilterProxyModel(this);
                selected_rows_model->setFilterRole(selectedRole);
                selected_rows_model->setFilterFixedString("1");
                selected_rows_model->setsourceModel(ui.devices_finder_tbl->model());
                
                P Offline
                P Offline
                Panoss
                wrote on last edited by Panoss
                #11

                @VRonin said in Copy selected rows of a table to a model:

                Again, you don't need a new model, you need a proxy. While I still suggest KSelectionProxyModel

                I tried it,but I had to include KSelectionProxyModel.h, KSelectionProxyModel.cpp, kdemacros.h etc etc. (and find - create these files)
                Every time I added a file, ten more were needed.
                I 'll try your solution.

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

                  For reference, to build the module containing KSelectionProxyModel on windows with MSVC:

                  1. install git
                  2. install cmake
                  3. clone the repository git://anongit.kde.org/kitemmodels.git
                  4. open the developer console (qtenv2.bat and vcvarsall.bat)
                  5. run
                  set KDELIBPATH = C:\KDE
                  mkdir build
                  cd build
                  cmake -G "NMake Makefiles" -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=%KDELIBPATH% -DCMAKE_BUILD_TYPE=DEBUG ../
                  cmake --build .
                  cmake --build . --target install
                  cmake -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX=%KDELIBPATH% -DCMAKE_BUILD_TYPE=RELEASE ../
                  cmake --build .
                  cmake --build . --target install
                  

                  this will install the module in C:\KDE

                  to link it, in your project add to the .pro file:

                  LIBS += -LC:/KDE/lib
                  INCLUDEPATH +=  C:/KDE/include/KF5/KItemModels
                  CONFIG(release, debug|release) {
                  LIBS += -lKF5ItemModels
                  }
                  CONFIG(debug, debug|release) {
                  LIBS += -lKF5ItemModelsd
                  }
                  

                  to install in other platforms/compilers you'll need to change the cmake generator (the part after -G) a list can be found here: https://cmake.org/cmake/help/v3.0/manual/cmake-generators.7.html

                  "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
                  • P Offline
                    P Offline
                    Panoss
                    wrote on last edited by
                    #13

                    VRonin thank you, but I 'd rather live without KDE :).
                    I think it's too much trouble for something very simple.

                    1 Reply Last reply
                    0
                    • P Offline
                      P Offline
                      Panoss
                      wrote on last edited by
                      #14

                      I get an error:

                      error: C2143: syntax error : missing ',' before ':'
                      

                      at line

                      for(const QModelIndex &singleIdx : selectedIdx)
                      
                      1 Reply Last reply
                      0
                      • VRoninV Offline
                        VRoninV Offline
                        VRonin
                        wrote on last edited by VRonin
                        #15

                        try with foreach(const QModelIndex &singleIdx , selectedIdx)

                        VRonin thank you, but I 'd rather live without KDE :).
                        I think it's too much trouble for something very simple.

                        We agree to disagree then

                        "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
                        • P Offline
                          P Offline
                          Panoss
                          wrote on last edited by Panoss
                          #16

                          @VRonin I decided to follow your advice :) and try KDE:

                          1. I installed git in G:\Program Files\Git.
                          2. I installed cmake in G:\Program Files\CMake (and I put the G:\Program Files\CMake\bin in the PATH variable).
                          3. I cloned the repository git://anongit.kde.org/kitemmodels.git in G:/kitemmodels
                          4. I opened the developer console (qtenv2.bat )
                            Here, I don't understand what you mean by "and vcvarsall.bat", isn't my developer console the:
                            G:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qtenv2.bat?
                          5. I run (in developer console, my drive letter is G:)
                          set KDELIBPATH = G:\KDE
                          mkdir build
                          cd build
                          cmake -G "NMake Makefiles" -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=%KDELIBPATH% -DCMAKE_BUILD_TYPE=DEBUG ../
                          

                          Here I get the error: "CMAke error: the source directory G:/Qt/Qt5.0.2/5.0.2/msvc2010 does not appear to contain CMakeLists.txt".

                          VRoninV 1 Reply Last reply
                          0
                          • P Panoss

                            @VRonin I decided to follow your advice :) and try KDE:

                            1. I installed git in G:\Program Files\Git.
                            2. I installed cmake in G:\Program Files\CMake (and I put the G:\Program Files\CMake\bin in the PATH variable).
                            3. I cloned the repository git://anongit.kde.org/kitemmodels.git in G:/kitemmodels
                            4. I opened the developer console (qtenv2.bat )
                              Here, I don't understand what you mean by "and vcvarsall.bat", isn't my developer console the:
                              G:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qtenv2.bat?
                            5. I run (in developer console, my drive letter is G:)
                            set KDELIBPATH = G:\KDE
                            mkdir build
                            cd build
                            cmake -G "NMake Makefiles" -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=%KDELIBPATH% -DCMAKE_BUILD_TYPE=DEBUG ../
                            

                            Here I get the error: "CMAke error: the source directory G:/Qt/Qt5.0.2/5.0.2/msvc2010 does not appear to contain CMakeLists.txt".

                            VRoninV Offline
                            VRoninV Offline
                            VRonin
                            wrote on last edited by
                            #17
                            1. I installed git in G:\Program Files\Git.
                            2. I installed cmake in G:\Program Files\CMake (and I put the G:\Program Files\CMake\bin in the PATH variable).
                            3. I cloned the repository git://anongit.kde.org/kitemmodels.git in G:/kitemmodels
                            4. I opened the developer console (qtenv2.bat )

                            All good

                            Here, I don't understand what you mean by "and vcvarsall.bat", isn't my developer console the:
                            G:\Qt\Qt5.0.2\5.0.2\msvc2010\bin\qtenv2.bat?

                            What compiler are you using? my guide is for MSVC, when you call qtenv2.bat for an MSVC compiler it prints out a reminder "Don't forget to run vcvarsall", that is the compiler environment setup, for MSVC2013 it's somewhere looking like C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat here you have pass an extra argument to determine the platform, for example C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat x86 or C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat amd64

                            1. I run (in developer console, my drive letter is G:)
                            set KDELIBPATH = G:\KDE
                            mkdir build
                            cd build
                            cmake -G "NMake Makefiles" -DCMAKE_DEBUG_POSTFIX=d -DCMAKE_INSTALL_PREFIX=%KDELIBPATH% -DCMAKE_BUILD_TYPE=DEBUG ../
                            

                            Here I get the error: "CMAke error: the source directory G:/Qt/Qt5.0.2/5.0.2/msvc2010 does not appear to contain CMakeLists.txt".

                            you just are in the wrong folder, use cd G:\kitemmodels

                            "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

                            • Login

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