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. QFileSystemModel and QSortFilterProxyModel - root index is not preserved
Forum Updated to NodeBB v4.3 + New Features

QFileSystemModel and QSortFilterProxyModel - root index is not preserved

Scheduled Pinned Locked Moved Unsolved General and Desktop
c++qfilesystemmodeqsortfilterproxfiltering
25 Posts 8 Posters 7.2k Views 4 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.
  • M Offline
    M Offline
    mrjj
    Lifetime Qt Champion
    wrote on 28 Jun 2019, 15:40 last edited by
    #10

    Hi
    I can confirm it get the same result on Qt5.12.3 and Qt5.9
    so at least we can say its not a local bug of sorts.
    alt text

    #include <QApplication>
    #include <QFileSystemModel>
    #include <QSortFilterProxyModel>
    #include <QTreeView>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QTreeView treeView;
    
        QFileSystemModel navigationModel;
        navigationModel.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Files);
        navigationModel.setNameFilterDisables(true);
        QString root("C:/Qt/5.12.3/msvc2017_64");
        navigationModel.setRootPath(root);
    
        QSortFilterProxyModel filteringModel;
        filteringModel.setSourceModel(&navigationModel);
        filteringModel.setRecursiveFilteringEnabled(true);
        filteringModel.setFilterCaseSensitivity(Qt::CaseInsensitive);
    
        treeView.setModel(&filteringModel);
        treeView.setRootIndex(filteringModel.mapFromSource(navigationModel.index(root)));
    
        filteringModel.setFilterFixedString("Lib");
    
        treeView.show();
    
        return a.exec();
    }
    
    
    1 Reply Last reply
    3
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 28 Jun 2019, 19:01 last edited by
      #11

      As @mrjj I can reproduce that on macOS with a recent build of Qt.

      You should check the bug report system to see if there's already something related. If not, then please consider opening a new report providing that minimal compilable example.

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

      1 Reply Last reply
      3
      • M Offline
        M Offline
        MasterBLB
        wrote on 28 Jun 2019, 20:10 last edited by
        #12

        Oh crap, tough luck :/ How to open a Qt bug report?

        M 1 Reply Last reply 28 Jun 2019, 20:12
        0
        • M MasterBLB
          28 Jun 2019, 20:10

          Oh crap, tough luck :/ How to open a Qt bug report?

          M Offline
          M Offline
          mrjj
          Lifetime Qt Champion
          wrote on 28 Jun 2019, 20:12 last edited by
          #13

          @MasterBLB
          Hi
          Well you just go there and login with the credentials you use here.
          A good read is
          https://wiki.qt.io/Reporting_Bugs

          1 Reply Last reply
          2
          • M Offline
            M Offline
            MasterBLB
            wrote on 2 Jul 2019, 08:47 last edited by
            #14

            @mrjj , @SGaist - have you reported the bug? If not I will try when I'll go back home after work.

            1 Reply Last reply
            0
            • S Offline
              S Offline
              SGaist
              Lifetime Qt Champion
              wrote on 2 Jul 2019, 08:51 last edited by
              #15

              Personally, I didn't. Since you found it, the honour is yours :)

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

              1 Reply Last reply
              1
              • M Offline
                M Offline
                mrjj
                Lifetime Qt Champion
                wrote on 2 Jul 2019, 09:03 last edited by
                #16

                Hi
                nope, if i had made report, i would have linked url here :)
                So please do.

                1 Reply Last reply
                0
                • V Offline
                  V Offline
                  VRonin
                  wrote on 2 Jul 2019, 09:15 last edited by
                  #17

                  I don't think it's a bug.
                  setRootIndex is a method of the view. The model has no way of knowing (and shouldn't know) what a view is using as root. The filter set on the proxy applies to the whole model. If the index used as root by a view gets filtered out it's only natural for a view to revert to using QModelIndex() as root.

                  What you need is a proxy model that implements the setRootIndex functionality at the model level. This is on the list of nice-things-I-would-like-to-add-to-Qt-models and it's a fairly easy one to do but I need to find time for 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

                  1 Reply Last reply
                  5
                  • M Offline
                    M Offline
                    MasterBLB
                    wrote on 2 Jul 2019, 18:34 last edited by
                    #18

                    ...and now I'm confused :/

                    J 1 Reply Last reply 2 Jul 2019, 18:41
                    0
                    • M MasterBLB
                      2 Jul 2019, 18:34

                      ...and now I'm confused :/

                      J Offline
                      J Offline
                      JonB
                      wrote on 2 Jul 2019, 18:41 last edited by
                      #19

                      @MasterBLB
                      Confused in what way? I have just read this thread and what @VRonin has written seems correct to me. Are you not understanding what he is saying, or what?

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        MasterBLB
                        wrote on 3 Jul 2019, 07:27 last edited by
                        #20

                        In the way such behavior breaks SOLID substitute rule - I can't use descendant class QFileSystemModel like it was its base class QAbstractItemModel in QSortFilterProxyModel. While not a 100% bug it's definitely a serious design flaw, and worth to be reported. But where?

                        jsulmJ V 2 Replies Last reply 3 Jul 2019, 08:01
                        0
                        • M MasterBLB
                          3 Jul 2019, 07:27

                          In the way such behavior breaks SOLID substitute rule - I can't use descendant class QFileSystemModel like it was its base class QAbstractItemModel in QSortFilterProxyModel. While not a 100% bug it's definitely a serious design flaw, and worth to be reported. But where?

                          jsulmJ Offline
                          jsulmJ Offline
                          jsulm
                          Lifetime Qt Champion
                          wrote on 3 Jul 2019, 08:01 last edited by
                          #21

                          @MasterBLB said in QFileSystemModel and QSortFilterProxyModel - root index is not preserved:

                          But where?

                          In Qt bug tracker https://bugreports.qt.io/secure/Dashboard.jspa
                          Also you can talk to Qt developers on their mailing list.

                          https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • M MasterBLB
                            3 Jul 2019, 07:27

                            In the way such behavior breaks SOLID substitute rule - I can't use descendant class QFileSystemModel like it was its base class QAbstractItemModel in QSortFilterProxyModel. While not a 100% bug it's definitely a serious design flaw, and worth to be reported. But where?

                            V Offline
                            V Offline
                            VRonin
                            wrote on 3 Jul 2019, 08:44 last edited by VRonin 7 Mar 2019, 10:08
                            #22

                            breaks SOLID

                            It doesn't. In fact, if it worked as you expected it would break SOLID

                            it's definitely a serious design flaw

                            Sorry to be brutal: No, it's not a flaw, you just didn't understand the design of model/views.
                            To help you get a better idea of what is going on, try use the same model with 2 different treeviews. In only one of the view call setRootIndex, and then trigger the filtering.

                            "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
                            • B Offline
                              B Offline
                              Brad1111
                              wrote on 12 Feb 2025, 22:50 last edited by
                              #23

                              Im actually encountering the very same issue.
                              Clearly it wont be fixed by Qt since Ive even seen posts about this issue back from 2011.
                              Could someone help me a little bit by telling me what to do please ?

                              @VRonin You were the most precise, suggesting to implements the setRootIndex to the proxymodel, but I would still require a bit more info if I am to do it on my own please :D

                              1 Reply Last reply
                              0
                              • jeremy_kJ Offline
                                jeremy_kJ Offline
                                jeremy_k
                                wrote on 13 Feb 2025, 02:51 last edited by
                                #24

                                It looks like @VRonin implemented his idea. See https://github.com/VSRonin/QtModelUtilities/blob/master/READMERootIndexProxyModel.md

                                Asking a question about code? http://eel.is/iso-c++/testcase/

                                B 1 Reply Last reply 13 Feb 2025, 04:28
                                1
                                • jeremy_kJ jeremy_k
                                  13 Feb 2025, 02:51

                                  It looks like @VRonin implemented his idea. See https://github.com/VSRonin/QtModelUtilities/blob/master/READMERootIndexProxyModel.md

                                  B Offline
                                  B Offline
                                  Brad1111
                                  wrote on 13 Feb 2025, 04:28 last edited by
                                  #25

                                  @jeremy_k Wow, Awesome ! Thanks for your answer and massive props to @VRonin !

                                  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