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. How to update QTableView when rows are inserted to it

How to update QTableView when rows are inserted to it

Scheduled Pinned Locked Moved Solved General and Desktop
model
23 Posts 4 Posters 16.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.
  • kshegunovK kshegunov

    @Ratzz
    Hello,
    I believe you should emit the QAbstractItemModel::rowsInserted signal from the model (after your call to endInsertRows), so the view knows to adapt to the changes.

    Kind regards.


    PS:

    switch(column)
    {
        case 0:
    

    You should really use (possibly unnamed) enums for that kind of switch constructs.

    RatzzR Offline
    RatzzR Offline
    Ratzz
    wrote on last edited by
    #3

    @kshegunov
    Thanks for the reply.
    But doc says

    Note: This is a private signal. It can be used in signal connections but cannot be emitted by the user.
    

    What does this mean?

    --Alles ist gut.

    kshegunovK 1 Reply Last reply
    0
    • RatzzR Ratzz

      @kshegunov
      Thanks for the reply.
      But doc says

      Note: This is a private signal. It can be used in signal connections but cannot be emitted by the user.
      

      What does this mean?

      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by
      #4

      @Ratzz
      It means it can't be emitted from the user of the class. Since you're not the user of the class, but rather the designer, I think you should just ignore the note. ;)

      Read and abide by the Qt Code of Conduct

      RatzzR 1 Reply Last reply
      0
      • kshegunovK kshegunov

        @Ratzz
        It means it can't be emitted from the user of the class. Since you're not the user of the class, but rather the designer, I think you should just ignore the note. ;)

        RatzzR Offline
        RatzzR Offline
        Ratzz
        wrote on last edited by
        #5

        @kshegunov
        It asks for QPrivateSignal http://postimg.org/image/bjpuc4bep/

        --Alles ist gut.

        kshegunovK 2 Replies Last reply
        0
        • RatzzR Ratzz

          @kshegunov
          It asks for QPrivateSignal http://postimg.org/image/bjpuc4bep/

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by
          #6

          @Ratzz
          Oops, sorry. The note above the one you cited states:

          It can only be emitted by the QAbstractItemModel implementation, and cannot be explicitly emitted in subclass code.
          

          Hm, in that case I'm not sure ... The documentation is somewhat cryptic whether endInsertRows() actually emits the aforementioned signal ...

          Read and abide by the Qt Code of Conduct

          RatzzR 1 Reply Last reply
          0
          • RatzzR Ratzz

            @kshegunov
            It asks for QPrivateSignal http://postimg.org/image/bjpuc4bep/

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by
            #7

            @Ratzz
            Possibly, you could try implementing QAbstractItemModel::dropMimeData without intercepting the drop event?

            Read and abide by the Qt Code of Conduct

            1 Reply Last reply
            2
            • kshegunovK kshegunov

              @Ratzz
              Oops, sorry. The note above the one you cited states:

              It can only be emitted by the QAbstractItemModel implementation, and cannot be explicitly emitted in subclass code.
              

              Hm, in that case I'm not sure ... The documentation is somewhat cryptic whether endInsertRows() actually emits the aforementioned signal ...

              RatzzR Offline
              RatzzR Offline
              Ratzz
              wrote on last edited by Ratzz
              #8

              @kshegunov
              The beginInsertRows doc http://doc.qt.io/qt-4.8/qabstractitemmodel.html#beginInsertRows says

              Note: This function emits the rowsAboutToBeInserted() signal which connected views (or proxies) must handle before the data is inserted. Otherwise, the views may end up in an invalid state.
              

              Will it help?

              --Alles ist gut.

              kshegunovK 1 Reply Last reply
              0
              • RatzzR Ratzz

                @kshegunov
                The beginInsertRows doc http://doc.qt.io/qt-4.8/qabstractitemmodel.html#beginInsertRows says

                Note: This function emits the rowsAboutToBeInserted() signal which connected views (or proxies) must handle before the data is inserted. Otherwise, the views may end up in an invalid state.
                

                Will it help?

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by kshegunov
                #9

                @Ratzz
                Yes, I saw that, but this is to notify the view insertions will be happening. The question is whether endInsertRows() emits rowsInserted() thus telling the view the insertion has finished and it can actually update itself. Unfortunately, the documentation doesn't state anything specific about endInsertRows(), unless I completely missed it ...

                PS. I just noticed something in your code:

                QTreeView * view= dynamic_cast<QTreeView*>(event->source());
                

                Is this a typo?

                Read and abide by the Qt Code of Conduct

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

                  Hi,

                  The documentation doesn't specify but the implementation does emit rowsInserted. However in this case insertRows doesn't do anything so I wonder if there isn't a caching mechanism that avoids to update the view if in fact nothing has changed.

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  RatzzR kshegunovK 2 Replies Last reply
                  1
                  • kshegunovK kshegunov

                    @Ratzz
                    Yes, I saw that, but this is to notify the view insertions will be happening. The question is whether endInsertRows() emits rowsInserted() thus telling the view the insertion has finished and it can actually update itself. Unfortunately, the documentation doesn't state anything specific about endInsertRows(), unless I completely missed it ...

                    PS. I just noticed something in your code:

                    QTreeView * view= dynamic_cast<QTreeView*>(event->source());
                    

                    Is this a typo?

                    RatzzR Offline
                    RatzzR Offline
                    Ratzz
                    wrote on last edited by
                    #11

                    @kshegunov said:

                    Is this a typo?

                    I drag the items from another QTreeView .The cast is for that..
                    Did you mean that?

                    --Alles ist gut.

                    1 Reply Last reply
                    0
                    • SGaistS SGaist

                      Hi,

                      The documentation doesn't specify but the implementation does emit rowsInserted. However in this case insertRows doesn't do anything so I wonder if there isn't a caching mechanism that avoids to update the view if in fact nothing has changed.

                      RatzzR Offline
                      RatzzR Offline
                      Ratzz
                      wrote on last edited by
                      #12

                      @SGaist said:
                      Thanks for the reply.
                      So there is no way with insertRows?

                      --Alles ist gut.

                      1 Reply Last reply
                      0
                      • SGaistS SGaist

                        Hi,

                        The documentation doesn't specify but the implementation does emit rowsInserted. However in this case insertRows doesn't do anything so I wonder if there isn't a caching mechanism that avoids to update the view if in fact nothing has changed.

                        kshegunovK Offline
                        kshegunovK Offline
                        kshegunov
                        Moderators
                        wrote on last edited by kshegunov
                        #13

                        @SGaist

                        However in this case insertRows doesn't do anything so I wonder if there isn't a caching mechanism that avoids to update the view if in fact nothing has changed.

                        After a quick look (without pretense to be complete) I couldn't clearly see any such caching done.
                        Here's what I peeked at (for Qt 5.6):
                        http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.cpp#n2601
                        http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.cpp#n582

                        @Ratzz

                        I drag the items from another QTreeView .The cast is for that..
                        Did you mean that?

                        Indeed I did. Have you considered handling the drag/drop events through the ordinary mechanism? Serializing on drag, then deserializing the mime data on drop?

                        Read and abide by the Qt Code of Conduct

                        RatzzR 1 Reply Last reply
                        1
                        • kshegunovK kshegunov

                          @SGaist

                          However in this case insertRows doesn't do anything so I wonder if there isn't a caching mechanism that avoids to update the view if in fact nothing has changed.

                          After a quick look (without pretense to be complete) I couldn't clearly see any such caching done.
                          Here's what I peeked at (for Qt 5.6):
                          http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.cpp#n2601
                          http://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/itemmodels/qabstractitemmodel.cpp#n582

                          @Ratzz

                          I drag the items from another QTreeView .The cast is for that..
                          Did you mean that?

                          Indeed I did. Have you considered handling the drag/drop events through the ordinary mechanism? Serializing on drag, then deserializing the mime data on drop?

                          RatzzR Offline
                          RatzzR Offline
                          Ratzz
                          wrote on last edited by
                          #14

                          @kshegunov said:

                          Serializing on drag, then deserializing the mime data on drop?

                          No i have not considered this part.

                          --Alles ist gut.

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

                            @kshegunov : I mean't view side caching.

                            @Ratzz currently you are not inserting anything through it. Like @kshegunov suggested, implement the drag and drop through the mechanism provided for model/view classes. It's described here

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            RatzzR 1 Reply Last reply
                            0
                            • SGaistS SGaist

                              @kshegunov : I mean't view side caching.

                              @Ratzz currently you are not inserting anything through it. Like @kshegunov suggested, implement the drag and drop through the mechanism provided for model/view classes. It's described here

                              RatzzR Offline
                              RatzzR Offline
                              Ratzz
                              wrote on last edited by
                              #16

                              @SGaist
                              I will try to implement through (link you provided ) this.

                              --Alles ist gut.

                              1 Reply Last reply
                              0
                              • RatzzR Ratzz

                                @kshegunov said:

                                Serializing on drag, then deserializing the mime data on drop?

                                No i have not considered this part.

                                kshegunovK Offline
                                kshegunovK Offline
                                kshegunov
                                Moderators
                                wrote on last edited by kshegunov
                                #17

                                @Ratzz

                                No i have not considered this part.

                                Then I suggest you try it out. It may prove to be easier and better behaved than pulling the records directly from the tree widget. As for your current implementation, I'm at a loss why it doesn't work. Maybe the tree view is losing the selection when dragging and the selection model returns no records?

                                @SGaist

                                I mean't view side caching.

                                I see, well I didn't look at the view (obviously) but I suppose it's possible.

                                Read and abide by the Qt Code of Conduct

                                RatzzR 1 Reply Last reply
                                1
                                • mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #18

                                  Hi
                                  I am still wondering. Sorry.
                                  Lets say If I dont have drag&drop.

                                  I simply append to my internal list used in model.

                                  How will I tell the view(s) that?

                                  I though dataChanged would do it but not even begin/endInsertRow
                                  does it.

                                  Thanks

                                  kshegunovK 1 Reply Last reply
                                  0
                                  • kshegunovK kshegunov

                                    @Ratzz

                                    No i have not considered this part.

                                    Then I suggest you try it out. It may prove to be easier and better behaved than pulling the records directly from the tree widget. As for your current implementation, I'm at a loss why it doesn't work. Maybe the tree view is losing the selection when dragging and the selection model returns no records?

                                    @SGaist

                                    I mean't view side caching.

                                    I see, well I didn't look at the view (obviously) but I suppose it's possible.

                                    RatzzR Offline
                                    RatzzR Offline
                                    Ratzz
                                    wrote on last edited by
                                    #19

                                    @kshegunov said:

                                    Maybe the tree view is losing the selection when dragging and the selection model returns no records?

                                    I don't think so because the rowCount is getting updated as and when the new drop takes place.

                                    --Alles ist gut.

                                    1 Reply Last reply
                                    0
                                    • mrjjM mrjj

                                      Hi
                                      I am still wondering. Sorry.
                                      Lets say If I dont have drag&drop.

                                      I simply append to my internal list used in model.

                                      How will I tell the view(s) that?

                                      I though dataChanged would do it but not even begin/endInsertRow
                                      does it.

                                      Thanks

                                      kshegunovK Offline
                                      kshegunovK Offline
                                      kshegunov
                                      Moderators
                                      wrote on last edited by
                                      #20

                                      @mrjj

                                      I simply append to my internal list used in model.

                                      I'm by no means an expert, but possibly calling submit() (I don't know if it works I'm just guessing)?

                                      Read and abide by the Qt Code of Conduct

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

                                        On a side note, your rowCount implementation should rather return the size of your TableList, that way it's one less thing to manage.

                                        Interested in AI ? www.idiap.ch
                                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                        RatzzR 1 Reply Last reply
                                        1
                                        • SGaistS SGaist

                                          On a side note, your rowCount implementation should rather return the size of your TableList, that way it's one less thing to manage.

                                          RatzzR Offline
                                          RatzzR Offline
                                          Ratzz
                                          wrote on last edited by
                                          #22

                                          @SGaist
                                          Yes ,now i am returning the size of TableList .

                                          --Alles ist gut.

                                          RatzzR 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