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. [SOLVED] QPersistentModelIndex usage
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] QPersistentModelIndex usage

Scheduled Pinned Locked Moved General and Desktop
24 Posts 2 Posters 15.8k Views 1 Watching
  • 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.
  • K Offline
    K Offline
    Kobid
    wrote on last edited by
    #10

    Last question. Can I use QPersistenModelIndex to build normal index? For example: I know that data in known QPersistenModelIndex changed. I need to emit dataChanged. My QPersistenModelIndex always point to first (0) column but I want to update whole row, so I need to create second index as "to" and point to the last column. Can I use QPersistenModelIndex.row() for "to" in QModelIndex? I'm confused because QPersistenModelIndex.row() point to old row after sorting.

    1 Reply Last reply
    0
    • raven-worxR Offline
      raven-worxR Offline
      raven-worx
      Moderators
      wrote on last edited by
      #11

      how do you sort? Using a QSortFilterProxyModel? Or in a custom model?

      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
      If you have a question please use the forum so others can benefit from the solution in the future

      1 Reply Last reply
      0
      • K Offline
        K Offline
        Kobid
        wrote on last edited by
        #12

        No, I'm using qSort on QList<HCFileItem>

        1 Reply Last reply
        0
        • raven-worxR Offline
          raven-worxR Offline
          raven-worx
          Moderators
          wrote on last edited by
          #13

          and are you sure you are triggering the right signals of the model to inform about the model change?

          --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
          If you have a question please use the forum so others can benefit from the solution in the future

          1 Reply Last reply
          0
          • K Offline
            K Offline
            Kobid
            wrote on last edited by
            #14

            I think so:

            @emit layoutAboutToBeChanged();
            qSort(childItems.begin(), childItems.end(), compareFilenameA);
            emit layoutChanged();@

            1 Reply Last reply
            0
            • raven-worxR Offline
              raven-worxR Offline
              raven-worx
              Moderators
              wrote on last edited by
              #15

              try "QAbstractItemModel::dataChanged()":http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#dataChanged
              If it doesn't make a difference you can also try "QAbstractItemModel::changePersistentIndex()":http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#changePersistentIndex

              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
              If you have a question please use the forum so others can benefit from the solution in the future

              1 Reply Last reply
              0
              • K Offline
                K Offline
                Kobid
                wrote on last edited by
                #16

                Same result. My model is sorted correctly but QPersistenModelIndex.row() has old value. Don't know if it's ok

                1 Reply Last reply
                0
                • raven-worxR Offline
                  raven-worxR Offline
                  raven-worx
                  Moderators
                  wrote on last edited by
                  #17

                  before further investigating i would recommend that you try "ModelTest":http://qt-project.org/wiki/Model_Test to make sure your model is implemented correctly.

                  --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                  If you have a question please use the forum so others can benefit from the solution in the future

                  1 Reply Last reply
                  0
                  • K Offline
                    K Offline
                    Kobid
                    wrote on last edited by
                    #18

                    Ehh, can't adjust ModelTest to my model. There are really missing example of QPersistentModelIndex usage. Summarizing, my model is working ok, but don't know why :P . I have this structure:

                    @struct HCFileItem {
                    QPersistentModelIndex persistentIndex;
                    };

                    class HCFileModel: public QAbstractItemModel
                    {
                    Q_OBJECT
                    public:
                    explicit HCFileModel(QObject parent=0);
                    ~HCFileModel();
                    protected:
                    QList<HCFileItem
                    > *mList=0;
                    };@

                    Example:

                    My model contain one item:

                    "bbbb"

                    Now I'm inserting (using beginInsertRows) item "aaaa" and my persistent indexes looks like:

                    "bbbb" (0,0)
                    "aaaa" (1,0)

                    Now I'm sorting my model using qSort on mList and emitting signal dataChanged(firstIndex, secondIndex). After this my persistent indexes looks like:

                    "aaaa" (1,0)
                    "bbbb" (0,0)

                    But it works, if I change data in "aaaa" and emit signal dataChanged with saved persistent index in HCFileItem then correct item is refreshed even if QPersistentModelIndex.row() point to wrong row. I'm confused

                    1 Reply Last reply
                    0
                    • raven-worxR Offline
                      raven-worxR Offline
                      raven-worx
                      Moderators
                      wrote on last edited by
                      #19

                      using ModelTest is as easy (nothing to adjust at all) as:
                      @
                      HCFileModel* model = new HCFileModel(parent);
                      new ModelTest(model, parent);
                      @
                      If your model has an error in any state while you use it an assertion will trigger and give you info what went wrong.

                      --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                      If you have a question please use the forum so others can benefit from the solution in the future

                      1 Reply Last reply
                      0
                      • K Offline
                        K Offline
                        Kobid
                        wrote on last edited by
                        #20

                        Ok my model pass test. So I have no idea why QPersistentModelIndex row() has old value after sort. But everything work, IsValid return True. Must check on QStandardItemModel and QSortFilterProxyModel if persistent index will keep old row too

                        1 Reply Last reply
                        0
                        • K Offline
                          K Offline
                          Kobid
                          wrote on last edited by
                          #21

                          Maybe should I somehow refresh all persistent indexes after sorting?

                          1 Reply Last reply
                          0
                          • K Offline
                            K Offline
                            Kobid
                            wrote on last edited by
                            #22

                            I did some dirty test. Instead of qSort(), I'm moving new added item manually to destination row by:
                            @beginMoveRows(parent->index, 4, 4, parent->index, 0);
                            parent->childItems.move(4,0); // this is QList
                            endMoveRows();@
                            ... and now all persistent indexes are updated automatically. So I suppose that I need to do something with persistent indexes after qSort() call. Or just call modelreset (I don't know which items changed after sort anyway) and create new persistent indexes for all items. changePersistentIndex doesn't change anything
                            And another question: where QPersistentModelIndex should be created? Now I'm creating it from "outside" model class (after childItems.append()) but maybe should I do this in QAbstractItemModel.createIndex() ?

                            1 Reply Last reply
                            0
                            • raven-worxR Offline
                              raven-worxR Offline
                              raven-worx
                              Moderators
                              wrote on last edited by
                              #23

                              [quote author="Kobid" date="1383942370"]
                              And another question: where QPersistentModelIndex should be created? Now I'm creating it from "outside" model class (after childItems.append()) but maybe should I do this in QAbstractItemModel.createIndex() ?[/quote]
                              Since QpersistenModelIndex are a bit of an overhead i would only create them when needed. Thus outside of the model is fine, thats what they are actually for. THe modle should only create QModelIndex objects.

                              --- SUPPORT REQUESTS VIA CHAT WILL BE IGNORED ---
                              If you have a question please use the forum so others can benefit from the solution in the future

                              1 Reply Last reply
                              0
                              • K Offline
                                K Offline
                                Kobid
                                wrote on last edited by
                                #24

                                Problem solved! I looked what QStandardItemModel do in sort method and I used similar algorithm. So here is complete solution if someone have same problem (note that my childs are based on QVectior, if you are using QList then you need to modify it a little):
                                @void HCDirModel::sortChilds(HCDirItem *p)
                                {
                                if (p->childCount()==0) return;

                                QVector<QPair<HCDirItem*, int> > l(p->childItems.count());
                                for (int i=0; i < p->childItems.count(); ++i) {
                                    l[i] = QPair<HCDirItem*,int>(p->childItems[i], i);
                                }
                                qStableSort(l.begin(), l.end(), compareFilenameA);
                                
                                QModelIndexList mFrom, mTo;
                                for (int i = 0; i < l.count(); ++i) {
                                    p->childItems[i] = l[i].first;
                                    QModelIndex from = createIndex(l[i].second, 0, l[i].first);
                                    if (persistentIndexList().contains(from)) {
                                        QModelIndex to = createIndex(i, 0, l[i].first);
                                        mFrom.append(from);
                                        mTo.append(to);
                                    }
                                }
                                
                                if (!mFrom.empty())
                                    changePersistentIndexList(mFrom,mTo);
                                

                                }@

                                And usage:
                                @emit layoutAboutToBeChanged();
                                sortChilds(it);
                                emit layoutChanged();@

                                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