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 Updated to NodeBB v4.3 + New Features

Move items in a QSortFilterProxyModel

Scheduled Pinned Locked Moved Unsolved General and Desktop
27 Posts 4 Posters 4.8k 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 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
                                        • 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

                                          You lied to me!

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

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

                                          @VRonin [I don't get what's happening in the pic? :( ]

                                          VRoninV 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