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.9k 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 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
                                        • JonBJ JonB

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

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

                                          @JonB https://www.youtube.com/watch?v=xXdD9yFZGv8

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

                                          • Login

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