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. Move items in a QSortFilterProxyModel
Forum Update on Monday, May 27th 2025

Move items in a QSortFilterProxyModel

Scheduled Pinned Locked Moved Unsolved General and Desktop
27 Posts 4 Posters 4.6k 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.
  • V Offline
    V Offline
    Valerian
    wrote on last edited by
    #1

    I have a tableview with takes a qsortfilterproxymodel and is filtered by a particular name.

    I have subclassed the qsortfilterproxymodel

    class FilterProxyModel : public QSortFilterProxyModel
    {
    	Q_OBJECT
    public:
    	FilterProxyModel(QObject *parent = 0);
    
    	void moveUp( const int itemIndex);
    	void moveDown( const int itemIndex);
    };
    

    and here's the implementation

    FilterProxyModel ::FilterProxyModel (QObject *parent) :
    	QSortFilterProxyModel(parent)
    {
    
    }
    
    void FilterProxyModel ::moveUp(const int itemIndex)
    {
    	if(itemIndex > 0 && itemIndex < rowCount())
    	{
    		beginMoveRows(QModelIndex(), itemIndex, itemIndex, QModelIndex(),
    					  itemIndex - 1);
    		moveRow(QModelIndex(), itemIndex, QModelIndex(), itemIndex - 1);
    		endMoveRows();
    	}
    }
    
    void FilterProxyModel ::moveDown(const int itemIndex)
    {
    	if(itemIndex >= 0 && itemIndex < rowCount() - 1)
    	{
    		beginMoveRows(QModelIndex(), itemIndex, itemIndex, QModelIndex(),
    					  itemIndex + 2);
    		moveRow(QModelIndex(), itemIndex, QModelIndex(), itemIndex + 2);
    		endMoveRows();
    	}
    }
    
    

    Here's how the model is initialized

    m_Model = new FilterProxyModel(this);
    m_Model ->setSourceModel(partiesModel);
    m_Model ->setFilterRegExp(QRegExp("party", Qt::CaseInsensitive, QRegExp::FixedString));
    m_Model ->setFilterKeyColumn(PartyModel::Action);
    

    I want to move the items using a push button, when i call the function the move doesn't happen. Could you tell me what I'm missing?

    JonBJ 1 Reply Last reply
    0
    • V Valerian

      I have a tableview with takes a qsortfilterproxymodel and is filtered by a particular name.

      I have subclassed the qsortfilterproxymodel

      class FilterProxyModel : public QSortFilterProxyModel
      {
      	Q_OBJECT
      public:
      	FilterProxyModel(QObject *parent = 0);
      
      	void moveUp( const int itemIndex);
      	void moveDown( const int itemIndex);
      };
      

      and here's the implementation

      FilterProxyModel ::FilterProxyModel (QObject *parent) :
      	QSortFilterProxyModel(parent)
      {
      
      }
      
      void FilterProxyModel ::moveUp(const int itemIndex)
      {
      	if(itemIndex > 0 && itemIndex < rowCount())
      	{
      		beginMoveRows(QModelIndex(), itemIndex, itemIndex, QModelIndex(),
      					  itemIndex - 1);
      		moveRow(QModelIndex(), itemIndex, QModelIndex(), itemIndex - 1);
      		endMoveRows();
      	}
      }
      
      void FilterProxyModel ::moveDown(const int itemIndex)
      {
      	if(itemIndex >= 0 && itemIndex < rowCount() - 1)
      	{
      		beginMoveRows(QModelIndex(), itemIndex, itemIndex, QModelIndex(),
      					  itemIndex + 2);
      		moveRow(QModelIndex(), itemIndex, QModelIndex(), itemIndex + 2);
      		endMoveRows();
      	}
      }
      
      

      Here's how the model is initialized

      m_Model = new FilterProxyModel(this);
      m_Model ->setSourceModel(partiesModel);
      m_Model ->setFilterRegExp(QRegExp("party", Qt::CaseInsensitive, QRegExp::FixedString));
      m_Model ->setFilterKeyColumn(PartyModel::Action);
      

      I want to move the items using a push button, when i call the function the move doesn't happen. Could you tell me what I'm missing?

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

      @Valerian

      • I believe your range is wrong, at least in ::moveDown. itemIndex + 2 doesn't seem right for a move by one row.... E.g. when itemIndex == rowCount() - 2 it will produce rowCount(), which is too high for beginMoveRows()?

      • beginMoveRows() can be passed more rows than you're actually moving. While debugging I would pass everything from 0 to rowCount() - 1 so that you can eliminate bad parameters to beginMoveRows() from being the issue.

      You are quite sure that with your QSortFilterProxyModel you are not imposing any kind of sort? Because adding/moving rows when Qt has sorting on always causes problems.

      1 Reply Last reply
      0
      • V Offline
        V Offline
        Valerian
        wrote on last edited by Valerian
        #3

        @JonB
        Yes I'm sure I'm not used any kind of sort. The move up function seems to select the next item but doesn't actually physically move it.

        JonBJ 1 Reply Last reply
        0
        • V Valerian

          @JonB
          Yes I'm sure I'm not used any kind of sort. The move up function seems to select the next item but doesn't actually physically move it.

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

          @Valerian

          • That's why I suggested you start by setting the range to all rows and see how you go.
          • beginMoveRows() returns a bool to indicate whether it likes your parameters. Check this! And carefully read the discussion of moving up & down in http://doc.qt.io/qt-5/qabstractitemmodel.html#beginMoveRows.
          V 1 Reply Last reply
          0
          • JonBJ JonB

            @Valerian

            • That's why I suggested you start by setting the range to all rows and see how you go.
            • beginMoveRows() returns a bool to indicate whether it likes your parameters. Check this! And carefully read the discussion of moving up & down in http://doc.qt.io/qt-5/qabstractitemmodel.html#beginMoveRows.
            V Offline
            V Offline
            Valerian
            wrote on last edited by
            #5

            @JonB said in Move items in a QSortFilterProxyModel:

            That's why I suggested you start by setting the range to all rows and see how you go.

            I tried setting the following for the moveUp

            if(itemIndex > 0 && itemIndex < rowCount())
            {
            	qDebug() << "SSSSSSSSS " << beginMoveRows(QModelIndex(), 0, rowCount() - 1, QModelIndex(),
            					  itemIndex - 1);
            		moveRow(QModelIndex(), itemIndex, QModelIndex(), itemIndex - 1);
            		endMoveRows();
            	}
            

            and here's the response

            SSSSSSSSS  false
            10:14:16.649 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "!this->isEmpty()" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qstack.h, line 62
            10:14:35.029 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "asize >= 0 && asize <= aalloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 535
            10:14:35.934 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "uint(d->size) <= d->alloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 614
            10:14:36.198 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "asize >= 0 && asize <= aalloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 535
            10:14:36.421 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "uint(d->size) <= d->alloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 614
            10:14:36.909 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "!this->isEmpty()" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qstack.h, line 62
            
            JonBJ 1 Reply Last reply
            0
            • V Valerian

              @JonB said in Move items in a QSortFilterProxyModel:

              That's why I suggested you start by setting the range to all rows and see how you go.

              I tried setting the following for the moveUp

              if(itemIndex > 0 && itemIndex < rowCount())
              {
              	qDebug() << "SSSSSSSSS " << beginMoveRows(QModelIndex(), 0, rowCount() - 1, QModelIndex(),
              					  itemIndex - 1);
              		moveRow(QModelIndex(), itemIndex, QModelIndex(), itemIndex - 1);
              		endMoveRows();
              	}
              

              and here's the response

              SSSSSSSSS  false
              10:14:16.649 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "!this->isEmpty()" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qstack.h, line 62
              10:14:35.029 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "asize >= 0 && asize <= aalloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 535
              10:14:35.934 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "uint(d->size) <= d->alloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 614
              10:14:36.198 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "asize >= 0 && asize <= aalloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 535
              10:14:36.421 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "uint(d->size) <= d->alloc" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 614
              10:14:36.909 18/07/2018 [FATAL] global\qglobal.cpp:3044 - ASSERT: "!this->isEmpty()" in file c:\users\qt\work\qt\qtbase\include\qtcore\../../src/corelib/tools/qstack.h, line 62
              
              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by JonB
              #6

              @Valerian
              Ignore my idea of passing "all" rows as range. Revert to whatever code you think is right for just one row. Then try again.

              The important thing is my second point, the return result of beginMoveRows() with whatever parameters you give it. Your debug shows it returned false. So long as it returns false in your case, it's not going to work, and you need to figure why not!

              V 1 Reply Last reply
              0
              • JonBJ JonB

                @Valerian
                Ignore my idea of passing "all" rows as range. Revert to whatever code you think is right for just one row. Then try again.

                The important thing is my second point, the return result of beginMoveRows() with whatever parameters you give it. Your debug shows it returned false. So long as it returns false in your case, it's not going to work, and you need to figure why not!

                V Offline
                V Offline
                Valerian
                wrote on last edited by
                #7

                @JonB said in Move items in a QSortFilterProxyModel:

                he important thing is my second point, the return result of beginMoveRows() with whatever parameters you give it. Your debug shows it returned false. So long as it returns false in your case, it's not going to work, and you need to figure why not!

                I reverted the code and it returns true but the row isn't actually shifted

                JonBJ 1 Reply Last reply
                0
                • V Valerian

                  @JonB said in Move items in a QSortFilterProxyModel:

                  he important thing is my second point, the return result of beginMoveRows() with whatever parameters you give it. Your debug shows it returned false. So long as it returns false in your case, it's not going to work, and you need to figure why not!

                  I reverted the code and it returns true but the row isn't actually shifted

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

                  @Valerian
                  Fair enough. Then I can only suggest you read that doc page carefully to understand what they are saying is required in each direction, and play with the parameters/which row/how far you move the row till you see something happening, and figure from there.

                  1 Reply Last reply
                  0
                  • VRoninV Offline
                    VRoninV Offline
                    VRonin
                    wrote on last edited by
                    #9
                    • moveRow must already call beginMoveRows and endMoveRows inside itself so you are duplicating calls
                    • moveRow is not implemented in any of Qt's model (as far as I'm aware) so it will probably just do nothing and return false (check the return value)

                    What model are you using as source to this proxy?

                    "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

                    V JonBJ 2 Replies Last reply
                    2
                    • VRoninV VRonin
                      • moveRow must already call beginMoveRows and endMoveRows inside itself so you are duplicating calls
                      • moveRow is not implemented in any of Qt's model (as far as I'm aware) so it will probably just do nothing and return false (check the return value)

                      What model are you using as source to this proxy?

                      V Offline
                      V Offline
                      Valerian
                      wrote on last edited by
                      #10

                      @VRonin said in Move items in a QSortFilterProxyModel:

                      What model are you using as source to this proxy?

                      QAbstractTableModel

                      VRoninV 1 Reply Last reply
                      0
                      • VRoninV VRonin
                        • moveRow must already call beginMoveRows and endMoveRows inside itself so you are duplicating calls
                        • moveRow is not implemented in any of Qt's model (as far as I'm aware) so it will probably just do nothing and return false (check the return value)

                        What model are you using as source to this proxy?

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

                        @VRonin
                        Don't forget OP is claiming that one of his moveUp/moveDown does work, while the other does not....

                        moveRow must already call beginMoveRows and endMoveRows inside itself so you are duplicating calls

                        If that's true that might explain....!

                        1 Reply Last reply
                        0
                        • V Valerian

                          @VRonin said in Move items in a QSortFilterProxyModel:

                          What model are you using as source to this proxy?

                          QAbstractTableModel

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

                          @Valerian said in Move items in a QSortFilterProxyModel:

                          QAbstractTableModel

                          Did you reimplement moveRow?

                          "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

                          V VRoninV 2 Replies Last reply
                          0
                          • VRoninV VRonin

                            @Valerian said in Move items in a QSortFilterProxyModel:

                            QAbstractTableModel

                            Did you reimplement moveRow?

                            V Offline
                            V Offline
                            Valerian
                            wrote on last edited by
                            #13

                            @VRonin I re-implemeted it in the QSortFilterProxyModel. Didn't want to move rows in the main model

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

                              Can you post the implementation?

                              "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

                              V 1 Reply Last reply
                              0
                              • V Valerian

                                @VRonin I re-implemeted it in the QSortFilterProxyModel. Didn't want to move rows in the main model

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

                                @Valerian
                                I now realise you got your code from https://stackoverflow.com/a/43683619/489865, didn't you? Wasn't actually confirmed to be correct solution. I still don't get where the + 2 comes from, but there you are.

                                IF @VRonin does not sort you out (so to speak :) ), I don't know, but maybe you should have a careful read of https://stackoverflow.com/a/12254935/489865. Not sure whether the following might affect you:

                                (2) Yes if you don't use sorting, just filtering. Qt in such case erases entire internal mapping and re-builds it from scratch so the data will be just as they appear in source model

                                V 1 Reply Last reply
                                0
                                • VRoninV VRonin

                                  Can you post the implementation?

                                  V Offline
                                  V Offline
                                  Valerian
                                  wrote on last edited by
                                  #16

                                  @VRonin said in Move items in a QSortFilterProxyModel:

                                  Can you post the implementation?

                                  I have already posted the implementation of the QSortFilterProxyModel. Are you seeking the implementation of the QAbstractTableModel?

                                  VRoninV 1 Reply Last reply
                                  0
                                  • V Valerian

                                    @VRonin said in Move items in a QSortFilterProxyModel:

                                    Can you post the implementation?

                                    I have already posted the implementation of the QSortFilterProxyModel. Are you seeking the implementation of the QAbstractTableModel?

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

                                    @VRonin said in Move items in a QSortFilterProxyModel:

                                    Did you reimplement moveRow?

                                    @Valerian said in Move items in a QSortFilterProxyModel:

                                    I re-implemeted it in the QSortFilterProxyModel.

                                    I don't see an implementation of FilterProxyModel::moveRow (or rather FilterProxyModel::moveRows) above

                                    "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

                                    V 1 Reply Last reply
                                    1
                                    • JonBJ JonB

                                      @Valerian
                                      I now realise you got your code from https://stackoverflow.com/a/43683619/489865, didn't you? Wasn't actually confirmed to be correct solution. I still don't get where the + 2 comes from, but there you are.

                                      IF @VRonin does not sort you out (so to speak :) ), I don't know, but maybe you should have a careful read of https://stackoverflow.com/a/12254935/489865. Not sure whether the following might affect you:

                                      (2) Yes if you don't use sorting, just filtering. Qt in such case erases entire internal mapping and re-builds it from scratch so the data will be just as they appear in source model

                                      V Offline
                                      V Offline
                                      Valerian
                                      wrote on last edited by
                                      #18

                                      @JonB said in Move items in a QSortFilterProxyModel:

                                      I now realise you got your code from https://stackoverflow.com/a/43683619/489865, didn't you? Wasn't actually confirmed to be correct solution. I still don't get where the + 2 comes from, but there you are.

                                      Yes I did pick it from there.

                                      Thanks for the other stackflow link. Will have a read on that.

                                      1 Reply Last reply
                                      0
                                      • VRoninV VRonin

                                        @VRonin said in Move items in a QSortFilterProxyModel:

                                        Did you reimplement moveRow?

                                        @Valerian said in Move items in a QSortFilterProxyModel:

                                        I re-implemeted it in the QSortFilterProxyModel.

                                        I don't see an implementation of FilterProxyModel::moveRow (or rather FilterProxyModel::moveRows) above

                                        V Offline
                                        V Offline
                                        Valerian
                                        wrote on last edited by
                                        #19

                                        @VRonin said in Move items in a QSortFilterProxyModel:

                                        I don't see an implementation of FilterProxyModel::moveRow (or rather FilterProxyModel::moveRows) above

                                        I haven't implement that. Not sure if I need to write that

                                        1 Reply Last reply
                                        0
                                        • VRoninV VRonin

                                          @Valerian said in Move items in a QSortFilterProxyModel:

                                          QAbstractTableModel

                                          Did you reimplement moveRow?

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

                                          @VRonin said in Move items in a QSortFilterProxyModel:

                                          Did you reimplement moveRow?

                                          @Valerian said in Move items in a QSortFilterProxyModel:

                                          I re-implemeted it in the QSortFilterProxyModel

                                          You lied to me!

                                          As I mentioned, the default implementation does nothing and returns false so calling it is pointless unless you reimplement it

                                          "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

                                          JonBJ 1 Reply Last reply
                                          1

                                          • Login

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