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 filter problem!!

QFileSystemModel filter problem!!

Scheduled Pinned Locked Moved General and Desktop
13 Posts 5 Posters 13.9k 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
    Kennylemon
    wrote on last edited by
    #1

    Hi all:
    I am a newbie in Qt programming.
    i'd like to make my own file manager, and using QListView, QTreeView, and two QFilesystemModel.

    here is the code:
    @
    void MainWindow::OnTreeClicked( const QModelIndex& idx )
    {
    QFileInfo kFolderinfo = m_pTreeModel->filePath( idx );
    ui->listView->setRootIndex( m_pListModel->setRootPath( kFolderinfo.filePath() ) );
    }

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    m_pListModel( NULL ),
    m_pTreeModel( NULL )
    {
    m_pListModel = new QFileSystemModel();
    m_pTreeModel = new QFileSystemModel();

    QString strDesktop = QDesktopServices::storageLocation( QDesktopServices::DesktopLocation );
    ui->setupUi(this);
    
    ui->listView->setModel( m_pListModel );
    m_pListModel->setFilter( QDir::NoDotAndDotDot | QDir::Files );
    QString strListFolder = strDesktop + QString("/FM test/test0/");
    QModelIndex kListidx = m_pListModel->setRootPath( strListFolder );    
    ui->listView->setRootIndex( kListidx );
    
    ui->treeView->setModel( m_pTreeModel );
    m_pTreeModel->setFilter( QDir::NoDotAndDotDot | QDir::AllDirs );
    ui->treeView->setRootIsDecorated( false );
    QModelIndex kTreeidx = m_pTreeModel->setRootPath( strDesktop );
    ui->treeView->setRootIndex( kTreeidx );
    
    connect( ui->treeView, SIGNAL( clicked( const QModelIndex& ) ), this, SLOT( OnTreeClicked( const QModelIndex& ) ) );
    

    }
    @

    I set the filter with "QDir::NoDotAndDotDot | QDir::Files", and the file manager shows perfect at the beginning.
    But after few steps, the filter becomes invalid.

    1. Double clicked the folder called "FM test", and it expands.
    2. Choose the folder called "test0", and the QListView shows all files without any folders in "test0".
      !http://dl.dropbox.com/u/24137109/test1.png(image1)!
    3. Double clicked the folder called "test0", and it expands.
    4. Choose the subfolder "testtest" of "test0".
    5. Choose back to the folder "test0", and the filter seems become invalid, which means the QListView shows all files and the folder called "testtest".
      !http://dl.dropbox.com/u/24137109/test2.png(image2)!

    here is the test project, and test files included "link":http://dl.dropbox.com/u/24137109/test.zip

    Am I missing something??
    Thanks in advanced!
    Kenny

    1 Reply Last reply
    0
    • L Offline
      L Offline
      loladiro
      wrote on last edited by
      #2

      Well, I don't have a solution for you, I can tell you that the filter is not being invalidated, but that there is a list within QFileSystemModel that contains exceptions from the filtering and calling setRootPath adds that directory to the list, but it's not being removed again (I don't know whether that's a problem with your code or with Qt). I'll have a look at it again tonight, when I have more time.

      Edit: Turns out I actually do have a workaround for you ^^:
      @void MainWindow::OnTreeClicked( const QModelIndex& idx )
      {
      ui->listView->setRootIndex( m_pListModel->setRootPath( m_pTreeModel->fileInfo(idx).absoluteFilePath() ) );
      m_pListModel->setNameFilters(QStringList());
      }@
      If you are interested, the setNameFilters method clears that internal list I mentioned. Also, this is not the proper way to do it, but rather a dirty hack. I'll have a look later, where the actual problem lies.

      1 Reply Last reply
      0
      • K Offline
        K Offline
        Kennylemon
        wrote on last edited by
        #3

        I am really appreciate what you have done for me and for the problem.
        Wow...the documentation never mention about the list inside of QFileSystemModel, really interesting.

        The setNameFilters method really works for some situation, but not all of it.
        Actually, I need the Namefilter to filter out some files.

        Should I try to find some other ways to clear the list inside of QFileSystemModel??

        Though, I am using Qt 4.7, I found out the description in Qt 4.4 like:
        QModelIndex QFileSystemModel::setRootPath ( const QString & newPath )
        Sets the directory that is being watched by the model to newPath. If the path is changed the model will be reset.

        Is it possible that the reason of this problem is related to this sentence "If the path is changed the model will be reset."??
        What is "the model will be reset" really mean?

        Thank you very much.

        1 Reply Last reply
        0
        • K Offline
          K Offline
          Kennylemon
          wrote on last edited by
          #4

          It seems like that the setFilter() will not work after setRootPath(), because the filter is still the same!!!

          A way to solve the problem is to change the filter after setRootPath()!!!

          Is there anything much official way to solve this problem?!?

          Thanks in advanced!!

          1 Reply Last reply
          0
          • M Offline
            M Offline
            Marga
            wrote on last edited by
            #5

            Hello!!

            I'm new to Qt (as well as to the forum). I have EXACTLY the same problem described here. I have been googling for quite a while and I see other people have written about it as well. However, nobody seems to give a solution to the problem :(

            If I have understood well, the QFileSystemModel is reset everytime its root path is set, right? And that is how the filters seem to get lost... But then, how can the values of the filters be restored? I have tried setting them again after the setRootPath() but the problem persists...

            I would really appreciate some insight about the issue! :)) Thanks a million in advance!!

            1 Reply Last reply
            0
            • K Offline
              K Offline
              Kennylemon
              wrote on last edited by
              #6

              Don't know if the solution fits your needs.
              The solution is a tricky one, just try it !!!

              @
              QDir::Filters kOriFilters = Model->filter()
              View->setCurrentIndex( Model->setRootPath( setRootPath( thePath ) ) );
              Model->setFilter( the Filter different from the origin );
              Model->setFilter( kOriFilters );
              @

              1 Reply Last reply
              0
              • M Offline
                M Offline
                Marga
                wrote on last edited by
                #7

                Thank you very much for your answer Kennylemon! I have tried your solution inserting this code in the slot function which is called when the user clicks on a certain folder on the tree view, but the problem seems to persist :( Did this work for you?

                Now I am trying to use a QSortFilterProxyModel as the model for the QListView, but I've had no luck so far. I will keep you posted!

                Thank you for your help!

                1 Reply Last reply
                0
                • K Offline
                  K Offline
                  Kennylemon
                  wrote on last edited by
                  #8

                  Hi, Marga, The solution works for me !!!
                  How about show us all the code u got ?!

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

                    Hello again!!

                    Here is the code I tried following your advice.

                    @
                    void MainWindow::OnTreeClicked(const QModelIndex& index)
                    {
                    QString sPath = treeModel->fileInfo(index).absoluteFilePath();
                    QDir::Filters origFilters = listModel->filter();
                    ui.listView->setRootIndex(listModel->setRootPath(sPath));
                    listModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
                    listModel->setFilter(origFilters);
                    ui.treeView->setCurrentIndex(index);
                    }
                    @

                    An this didn't work. However, the workaround that loladiro proposed worked for me, because I don't need to filter out any files... But there should be a better solution, right??

                    If you read the documentation on setFilter(), ("here":http://doc.qt.nokia.com/latest/qfilesystemmodel.html#setFilter) it says "Note that the filter you set should always include the QDir::AllDirs enum value, otherwise QFileSystemModel won't be able to read the directory structure." This makes all VERY confusing.

                    Thanks again!
                    Marga

                    1 Reply Last reply
                    0
                    • K Offline
                      K Offline
                      Kennylemon
                      wrote on last edited by
                      #10

                      The snippet about filter things are almost the same as mine, and it works for mine problem!!
                      Maybe the problem we got is different?!

                      1 Reply Last reply
                      0
                      • M Offline
                        M Offline
                        Marga
                        wrote on last edited by
                        #11

                        I don't know what to think, if it works for you it should work for me, right? Anyway, thanks a million for your help, I REALLY appreciate it!!

                        Marga

                        1 Reply Last reply
                        0
                        • O Offline
                          O Offline
                          ortizjavier
                          wrote on last edited by
                          #12

                          Marga, could you solve this problem? I'm starting to think that is a Qt bug...
                          The given workarounds didn't work for me :(

                          1 Reply Last reply
                          0
                          • S Offline
                            S Offline
                            StefanSequality
                            wrote on last edited by
                            #13

                            I also have this problem on Qt 5.4.1. It seems this problem is still there: when I expand a subfolder suddenly this folder appears in the tableview that should just contain files.... very strange.

                            Moreover, sometimes the colums 1 and 2 appear even though I disabled colums with tableView->hideColumn(column 1 and 2). Very strange behavior that I have already spent too much time fixing :-). ReImplementing a FileSystemModel from scratch by subclassing QAbstractListModel would have been faster in my way. Right now I believe QFileSystemModel has some tricky parts that may contain bugs...

                            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