Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. TreeView of QFileSystemModel: Remember selection after sorting
Qt 6.11 is out! See what's new in the release blog

TreeView of QFileSystemModel: Remember selection after sorting

Scheduled Pinned Locked Moved Solved QML and Qt Quick
13 Posts 3 Posters 5.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.
  • VRoninV Offline
    VRoninV Offline
    VRonin
    wrote on last edited by
    #4

    connect a slot to QAbstractItemModel::layoutAboutToBeChanged where you access the QItemSelectionModel::selection(), iterate over all the indexes() and save them in a list of QPersistentModelIndexes

    Then create another slot to QAbstractItemModel::layoutChanged, clear the current selection, iterate over your saved indexes and re-select them

    "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

    1 Reply Last reply
    2
    • M Offline
      M Offline
      maxwell31
      wrote on last edited by maxwell31
      #5

      @VRonin Thank you for your answer. I think you are right, this is probably how it should be done. Now I am wondering about the following: I store the persistent indices in a

        QList<QPersistentModelIndex> _selectedIndices;
      

      I set it via a Q_INVOKABLE function

      Q_INVOKABLE void setSelected(QModelIndexList list) {
          _selectedIndices.clear();
          for(int i=0;i<list.count();i++) {
              _selectedIndices.append(QPersistentModelIndex(list[i]));
          }
      }
      

      Now I wonder about how to return it to QML so I don't get type problems

      1 Reply Last reply
      0
      • M Offline
        M Offline
        maxwell31
        wrote on last edited by maxwell31
        #6

        Ok, I should simply use a QVariantList instead of a QList<QPersistentModelIndex>. However, when I want to do the selection again in QML:

                    for(var item in selectionList) {
                        selection.select(item);
                    }
        

        I get the following error:

          qrc:/FileSystem.qml:136: Error: Unable to determine callable overload.  Candidates are:
        select(QItemSelection,QItemSelectionModel::SelectionFlags)
        select(QModelIndex,QItemSelectionModel::SelectionFlags)
        

        Why does it not recognice that the QVariant holds a QModelindex? But maybe I should do it all on the c++ side. However, I wonder how I get the QItemSelectionModel in my model, or how I can connect the QFileSystemModel and the QItemSelectionModel.

        JonBJ 1 Reply Last reply
        0
        • M maxwell31

          Ok, I should simply use a QVariantList instead of a QList<QPersistentModelIndex>. However, when I want to do the selection again in QML:

                      for(var item in selectionList) {
                          selection.select(item);
                      }
          

          I get the following error:

            qrc:/FileSystem.qml:136: Error: Unable to determine callable overload.  Candidates are:
          select(QItemSelection,QItemSelectionModel::SelectionFlags)
          select(QModelIndex,QItemSelectionModel::SelectionFlags)
          

          Why does it not recognice that the QVariant holds a QModelindex? But maybe I should do it all on the c++ side. However, I wonder how I get the QItemSelectionModel in my model, or how I can connect the QFileSystemModel and the QItemSelectionModel.

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

          @maxwell31
          Assuming QML compiler is no different than a prog lang compiler like C++, why should it? Each item in a QVariantList is a QVariant. They don't do code analysis :) You will need one of the cast<> constructs, or similar, I presume.

          1 Reply Last reply
          0
          • M Offline
            M Offline
            maxwell31
            wrote on last edited by maxwell31
            #8

            @JonB: Do you know how this can be done in QML? (I am calling the method from QML).

            1 Reply Last reply
            0
            • M Offline
              M Offline
              maxwell31
              wrote on last edited by
              #9

              Hm, actually yes, I can use the conversion functions from QVariant.

              Regarding my above error: The problem was I did not supply ItemSelectionModel.Select as the second argument

              1 Reply Last reply
              0
              • M Offline
                M Offline
                maxwell31
                wrote on last edited by
                #10

                @VRonin : You suggested I should access QItemSelectionModel in c++, how can this be done, if the QItemSelectionModel has only been attached to the view and not the model?

                VRoninV 1 Reply Last reply
                0
                • M maxwell31

                  @VRonin : You suggested I should access QItemSelectionModel in c++, how can this be done, if the QItemSelectionModel has only been attached to the view and not the model?

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

                  @maxwell31 I was thinking of something like:

                  class SelectionSaver : public QObject
                  Q_OBJECT
                  Q_DISABLE_COPY(SelectionSaver)
                  public:
                  explicit SelectionSaver(QObject* parent = nullptr) : QObject(parent){}
                  private:
                  QVector<QPersistentModelIndex> m_indexList;
                  public Q_SLOTS:
                  void storeSelection(const QModelIndexList& sel){
                  m_indexList.clear();
                  m_indexList.reserve(sel.size());
                  for(auto&& idx : sel)
                  m_indexList.append(idx);
                  }
                  void restoreSelection(QItemSelectionModel* selModel){
                  QItemSelection newSelection;
                  for(auto&& idx : qAsConst(m_indexList))
                  newSelection.select(idx,idx);
                  selModel->select(newSelection,QItemSelectionModel::ClearAndSelect);
                  m_indexList.clear();
                  }
                  };
                  

                  Then from QML you call storeSelection passing TreeView.selection. selectedIndexes and then call restoreSelection passing TreeView.selection

                  "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

                  1 Reply Last reply
                  2
                  • M Offline
                    M Offline
                    maxwell31
                    wrote on last edited by
                    #12

                    @VRonin Thanks a lot! I did not now that one can simply pass pointers of the objects from QML. However, for some reason it is not working yet. I will report on this tomorrow.

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      maxwell31
                      wrote on last edited by
                      #13

                      Yes, it works now. However, in restoreSelection you need to do

                                selModel->clearSelection();
                      

                      before selModel->select. Not sure why, but otherwise the new selection is not shown.

                      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