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 show folder with certain file name in it

How to show folder with certain file name in it

Scheduled Pinned Locked Moved General and Desktop
38 Posts 5 Posters 25.5k 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.
  • S Offline
    S Offline
    SherifOmran
    wrote on last edited by
    #7

    When I change *.txt into abc.txt, files are not selectable

    @
    QString filename = QFileDialog::getOpenFileName(
    this,
    "open db",
    QDir::currentPath(),
    "dB file (*.txt)"
    );
    @

    1 Reply Last reply
    0
    • L Offline
      L Offline
      lahianim
      wrote on last edited by
      #8

      for using the QSortFilterProxyModel you need to use Model
      in that case i think its better for you to use QFileSystemModel to provides a data model for the local filesystem.

      create your own class (MyClass) that inherits the QSortFilterProxyModel and implement the function:
      @virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const@
      and check if the folder match to your filter
      something like:
      @
      bool MyClass::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
      {
      QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);
      if( sourceModel()->isDir(index) && sourceModel->hasChildren(index))
      {
      QString fullPath = sourceModel()->fileInfo(index).absoluteFilePath();
      QDir dir(fullPath);
      QStringList children = dir.entryList( QDir::Files | QDir::NoSymLinks | Dir::NoDotAndDotDot);
      if( children.contain(QString("abc.txt"))
      return true;
      }
      return false;
      }

      after that you need to set the MyClass as your model and set it to a view like:
      QFileSystemModel *model = new QFileSystemModel;
      model->setRootPath(QDir::currentPath());
      MyClass *myClass = new MyClass;
      myClass->setSourceModel(model);

      QTreeView *tree = new QTreeView();
      tree->setModel(myClass);
      @
      now you have a treeview with filtering as you ask for

      1 Reply Last reply
      0
      • K Offline
        K Offline
        KA51O
        wrote on last edited by
        #9

        nice solution, very elegant.

        1 Reply Last reply
        0
        • S Offline
          S Offline
          SherifOmran
          wrote on last edited by
          #10

          I get this error

          qabstractmodel has no member isdir

          any idea?

          1 Reply Last reply
          0
          • S Offline
            S Offline
            SherifOmran
            wrote on last edited by
            #11

            Here is my full code

            header file myclass.h
            @
            #ifndef MYCLASS_H
            #define MYCLASS_H

            #include <QDate>
            #include <QSortFilterProxyModel>

            namespace Ui {
            class myclass;
            }

            class myclass : public QSortFilterProxyModel
            {
            Q_OBJECT

            public:
            myclass(QObject *parent = 0);

            protected:
            virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;

            private slots:
            void on_pushButton_clicked();

            private:
            Ui::myclass *ui;
            };

            #endif // MYCLASS_H

            @

            myclass.cpp
            @
            #include "myclass.h"
            #include <QtGui>
            #include <QFileInfo>
            #include <QDir>
            #include <QString>

            myclass::myclass(QObject *parent)
            : QSortFilterProxyModel(parent)
            {
            }

            bool myclass::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
            {
            QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);

             if (sourceModel()->isDir(index) && sourceModel->hasChildren(index))
             {
                  QString fullPath =   sourceModel()->fileInfo(index).absoluteFilePath();
                 QDir dir(fullPath);
                 QStringList children = dir.entryList( QDir::Files | QDir::NoSymLinks | Dir::NoDotAndDotDot);
            
                if( children.contain(QString("abc.txt")))
                      {
                         return true;
                        }
              }
             return false;
            

            }

            @

            In Class that searches and has browse button
            @
            #include "myclass.h"

            QFileSystemModel *model = new QFileSystemModel;
            model->setRootPath(QDir::currentPath());
            myclass *myClass  = new myclass;
            myClass->setSourceModel(model);
            
             QTreeView *tree = new QTreeView();
             tree->setModel(myClass);
             tree->show();
            

            @

            1 Reply Last reply
            0
            • L Offline
              L Offline
              lahianim
              wrote on last edited by
              #12

              yes you need to cast all sourceModel() to the real model like
              ((QFileSystemModel*)sourceModel())->isDir(....)

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

                thank you lahianim. now there is only one error left

                here is the new code

                @
                bool myclass::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
                {
                QFileSystemModel *sourceModel();

                QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);

                if ( (sourceModel()->isDir(index) && sourceModel->hasChildren(index)))
                {
                QString fullPath = sourceModel()->fileInfo(index).absoluteFilePath();
                QDir dir(fullPath);
                QStringList children = dir.entryList( QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);

                    if( children.contains(QString("abc.txt")))
                          {
                             return true;
                            }
                  }
                
                 return false;
                

                }

                @

                Error:

                request for member 'hasChildren' in 'sourceModel' which is of non-class type 'QFileSystemModel * ()()'

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  SherifOmran
                  wrote on last edited by
                  #14

                  I made some changes according to this website but I get an error
                  http://stackoverflow.com/questions/2101100/qfiledialog-filtering-folders/2126060#2126060
                  can any body help?

                  My Code
                  @ h file

                  #ifndef MYCLASS_H
                  #define MYCLASS_H

                  #include <QDate>
                  #include <QSortFilterProxyModel>

                  namespace Ui {
                  class myclass;
                  }

                  class myclass : public QSortFilterProxyModel
                  {
                  Q_OBJECT

                  public:
                  myclass(QObject *parent = 0);

                  protected:
                  virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;

                  private slots:
                  void on_pushButton_clicked();

                  private:
                  Ui::myclass *ui;
                  };

                  #endif // MYCLASS_H
                  @

                  cpp
                  @
                  #include "myclass.h"
                  #include <QtGui>
                  #include <QFileInfo>
                  #include <QDir>
                  #include <QString>
                  #include <QStringList>

                  myclass::myclass(QObject *parent)
                  : QSortFilterProxyModel(parent)
                  {
                  }

                  bool myclass::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
                  {

                  QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);
                  QFileSystemModel* filemodel = qobject_cast<QFileSystemModel*>(sourceModel());

                  if ( (filemodel->isDir(index)) && (filemodel->hasChildren(index)))
                  {
                  qDebug() << filemodel->fileName(index);
                  QString fullPath = filemodel->fileInfo(index).absoluteFilePath();
                  QDir dir(fullPath);
                  QStringList children = dir.entryList( QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);

                      if( children.contains(QString("abc.txt")))
                            {
                               return true;
                              }
                    }
                  
                   return false;
                  

                  }

                  @

                  I call it this way

                  @
                  QFileDialog dialog;
                  myclass* proxyModel = new myclass();
                  dialog.setProxyModel(proxyModel);
                  dialog.exec();
                  @

                  Error:

                  symbols not found for architect x86_64
                  collect 2: Id returned 1 exit status

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    SherifOmran
                    wrote on last edited by
                    #15

                    I am building on mac with QT Creater 2.4.1 based on QT 4.7.4

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      SherifOmran
                      wrote on last edited by
                      #16

                      Now it compiles well. However, I want to show only files called abc.txt. I still don't know where is the file name in which variables. Any help?

                      header
                      @
                      #ifndef MYCLASS_H
                      #define MYCLASS_H
                      #include <QSortFilterProxyModel>
                      class myclass : public QSortFilterProxyModel
                      {
                      Q_OBJECT

                      public:
                      explicit myclass(QObject *parent = 0);

                      protected:
                      bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;
                      };

                      #endif // MYCLASS_H
                      @

                      @

                      #include "myclass.h"
                      #include <QtGui>
                      #include <QFileInfo>
                      #include <QDir>
                      #include <QString>
                      #include <Qdebug>

                      myclass::myclass(QObject *parent)
                      : QSortFilterProxyModel(parent)
                      {
                      }

                      bool myclass::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
                      {
                      QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);
                      QFileSystemModel* filemodel = qobject_cast<QFileSystemModel*>(sourceModel());

                       qDebug() << filemodel->fileName(index) << filemodel->isDir(index) << filemodel->hasChildren(index);
                      
                       if (filemodel->fileName(index).contains("abc.txt", Qt::CaseInsensitive))
                       {
                           return true;
                       }
                           else
                       {
                           return false;
                       }
                      

                      }

                      @

                      1 Reply Last reply
                      0
                      • L Offline
                        L Offline
                        lahianim
                        wrote on last edited by
                        #17

                        Hi
                        if you still using this:

                        bq. QFileDialog dialog;
                        myclass* proxyModel = new myclass();
                        dialog.setProxyModel(proxyModel);
                        dialog.exec();

                        you need to set the source model to the proxy model like before:

                        bq. QFileSystemModel *model = new QFileSystemModel;
                        model->setRootPath(QDir::currentPath());
                        MyClass *myClass = new MyClass;
                        myClass->setSourceModel(model);
                        QTreeView *tree = new QTreeView();
                        tree->setModel(myClass);

                        1 Reply Last reply
                        0
                        • S Offline
                          S Offline
                          SherifOmran
                          wrote on last edited by
                          #18

                          I don't get the file info but the directory structure

                          "/"
                          "/Volumes/DATA/MAC/login-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug/login.app/Contents/MacOS"
                          "/Volumes/DATA/MAC/login-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug/login.app/Contents"
                          "/Volumes/DATA/MAC/login-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug/login.app"
                          "/Volumes/DATA/MAC/login-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug"
                          "/Volumes/DATA/MAC/tt-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug"
                          "/Volumes/DATA/MAC"
                          "/Volumes/DATA"
                          "/Users"
                          "/Volumes"
                          QFileInfo::absolutePath: Constructed with empty filename
                          2012-08-12 12:43:07.026 login[37625:407] Invalid URL passed to an open/save panel: '(null)'. Using 'file://localhost/Volumes/DATA/MAC/tt-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug/' instead.
                          2012-08-12 12:43:07.786 login[37625:407] Invalid URL passed to an open/save panel: '(null)'. Using 'file://localhost/Volumes/DATA/MAC/tt-build-desktop-Desktop_Qt_4_7_3_for_GCC__Qt_SDK__Debug/' instead.
                          "/"

                          and when I do qDebug () << info.fileName();
                          I get the folders without the path

                          @
                          void Login::on_loginbrowse_clicked()
                          {
                          // selecting a new setting.dB file
                          //QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(parent);
                          //filterModel->setSourceModel(stringListModel);

                          QFileSystemModel *model = new QFileSystemModel;
                          model->setRootPath(QDir::currentPath());
                          
                          myclass *myClass  = new myclass (this);
                          myClass->setSourceModel(model);
                          
                          QFileDialog *dialog = new QFileDialog;
                          dialog->setDirectory(qApp->applicationDirPath());
                          
                          dialog->setProxyModel(myClass);
                          dialog->exec&#40;&#41;;
                          

                          }
                          @

                          myclass
                          @

                          #include "myclass.h"
                          #include <QtGui>
                          #include <QFileInfo>
                          #include <QDir>
                          #include <QString>
                          #include <Qdebug>

                          myclass::myclass(QObject *parent)
                          : QSortFilterProxyModel(parent)
                          {
                          }

                          bool myclass::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
                          {
                          QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);
                          QFileSystemModel* filemodel = qobject_cast<QFileSystemModel*>(sourceModel());
                          // QFileSystemModel filemodel = static_cast<QFileSystemModel>(sourceModel());
                          filemodel->setRootPath(QDir::currentPath());
                          QFileInfo info(filemodel->filePath(index));
                          QString filePath = info.absoluteFilePath();
                          QString fullPath = filemodel->fileInfo(index).absoluteFilePath();
                          qDebug () << filePath;

                           if (info.fileName().contains("Setting"))
                           {
                               return true;
                           }
                              return false;
                          

                          }

                          @

                          Header
                          @
                          #ifndef MYCLASS_H
                          #define MYCLASS_H

                          #include <QSortFilterProxyModel>
                          class myclass : public QSortFilterProxyModel
                          {
                          Q_OBJECT

                          public:
                          explicit myclass(QObject *parent = 0);

                          protected:
                          bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;
                          };

                          #endif // MYCLASS_H

                          @

                          1 Reply Last reply
                          0
                          • S Offline
                            S Offline
                            SherifOmran
                            wrote on last edited by
                            #19

                            can you send me a working example. Please the full code, i am not accustomed to the terminologies used.

                            1 Reply Last reply
                            0
                            • L Offline
                              L Offline
                              lahianim
                              wrote on last edited by
                              #20

                              the following code works for me. i tested it on win7 but this QT so it need to run on MAC too.

                              myfilterproxy.h
                              @
                              #ifndef MYFILTERPROXY_H
                              #define MYFILTERPROXY_H

                              #include <QSortFilterProxyModel>

                              class MyFilterProxy : public QSortFilterProxyModel
                              {
                              Q_OBJECT
                              public:
                              explicit MyFilterProxy(QObject *parent = 0);

                              protected:
                              bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const;

                              };

                              #endif // MYFILTERPROXY_H
                              @

                              myfilterproxy.cpp

                              @
                              #include "myfilterproxy.h"
                              #include <QDir>
                              #include <QFileSystemModel>
                              #include <QStringList>

                              MyFilterProxy::MyFilterProxy(QObject *parent) :
                              QSortFilterProxyModel(parent)
                              {
                              }

                              bool MyFilterProxy::filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const
                              {

                              QModelIndex index = ((QFileSystemModel*)sourceModel())->index(source_row, 0/*column*/, source_parent);
                              if( ((QFileSystemModel*)sourceModel())->isDir(index) && ((QFileSystemModel*)sourceModel())->hasChildren(index))
                              {
                                  QString fullPath =   ((QFileSystemModel*)sourceModel())->fileInfo(index).absoluteFilePath();
                                  QDir dir(fullPath);
                                  QStringList children = dir.entryList( QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);
                                  if( children.contains(QString("abc.txt")) )
                                      return true;
                              }
                              return false;
                              

                              }
                              @

                              main.cpp
                              @
                              #include <QtGui/QApplication>
                              #include <QFileDialog>
                              #include "myfilterproxy.h"

                              int main(int argc, char *argv[])
                              {
                              QApplication a(argc, argv);
                              MyFilterProxy myProxy;
                              QFileDialog fileDialog;
                              //its your call if to use this line (or default or other view mode)
                              fileDialog.setViewMode(QFileDialog::Detail);
                              fileDialog.setProxyModel(&myProxy);
                              fileDialog.exec();
                              return a.exec();
                              }
                              @

                              i'll hope it help you.

                              1 Reply Last reply
                              0
                              • S Offline
                                S Offline
                                SherifOmran
                                wrote on last edited by
                                #21

                                I tested it but it does not function correctly. Lets change the function to make it simple. I want to be able to select abc.txt and unable to select all other files. Currently, I can select all files and folders.

                                1 Reply Last reply
                                0
                                • L Offline
                                  L Offline
                                  lahianim
                                  wrote on last edited by
                                  #22

                                  sorry but i don't understand what you need to do exactly.
                                  you asked to show the user only the folder that include abc.txt and that what the code do.
                                  if you want that the user will show only the abc.txt files you can add a QRegExp to the MyFilterProxy and (i think) to remove the filterAcceptsRow

                                  or try this:
                                  @
                                  QFileDialog fileDialog;
                                  fileDialog.setFilter("abc.txt");
                                  fileDialog.exec();
                                  @

                                  the dialog will show you the file system and when you'll enter a folder with file name exactlly abc.txt you will see it and have the option to select it (the filter will ignore all other files name)

                                  1 Reply Last reply
                                  0
                                  • S Offline
                                    S Offline
                                    SherifOmran
                                    wrote on last edited by
                                    #23

                                    here is my last code.

                                    1- your code in the main, breaks on mac but the following works. It seems declaration should be only as pointers
                                    @
                                    myclass myProxy = new myclass;
                                    QFileDialog fileDialog = new QFileDialog;
                                    //fileDialog->setDirectory(qApp->applicationDirPath());
                                    //its your call if to use this line (or default or other view mode)
                                    fileDialog->setViewMode(QFileDialog::Detail);
                                    fileDialog->setProxyModel(myProxy);
                                    fileDialog->exec();
                                    @
                                    2- In myclass, I use the following code
                                    @ QModelIndex index = sourceModel()->index(source_row, 0/column/, source_parent);
                                    QFileSystemModel
                                    filemodel = qobject_cast<QFileSystemModel
                                    >(sourceModel());
                                    // QFileSystemModel filemodel = static_cast<QFileSystemModel>(sourceModel());
                                    filemodel->setRootPath(QDir::currentPath());
                                    QString fullPath = filemodel->fileInfo(index).absoluteFilePath();
                                    QDir dir(fullPath);
                                    QStringList children = dir.entryList( QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);
                                    qDebug () << children;
                                    @
                                    It prints now the files in the folders

                                    Now I need to check in the Qstringlist for the file "abc.txt" and return true for this file only otherwise false.

                                     foreach (QString str,children)
                                        {
                                            
                                        }
                                    
                                    1 Reply Last reply
                                    0
                                    • S Offline
                                      S Offline
                                      SherifOmran
                                      wrote on last edited by
                                      #24

                                      Yes, I changed the target, instead of showing the folder that contains the file. I show the files and make the file "abc.txt" selectable .

                                      The setfilter does not work properly, it shows me all files are unselectable
                                      @QFileDialog fileDialog;
                                      fileDialog.setFilter("abc.txt");
                                      fileDialog.exec();
                                      @

                                      1 Reply Last reply
                                      0
                                      • L Offline
                                        L Offline
                                        lahianim
                                        wrote on last edited by
                                        #25

                                        first about your code bq. foreach (QString str,children) { }
                                        you can use:
                                        @if(children.contains("abc.txt")) return true; else false;@

                                        and about your last message:
                                        [quote author="SherifOmran" date="1344846279"]Yes, I changed the target, instead of showing the folder that contains the file. I show the files and make the file "abc.txt" selectable .

                                        [/quote]
                                        lets say you have 2 files named "abc.txt" at the paths:
                                        "C:\some_folder\abc.txt" and
                                        "D:\other_folder\new_folder\abc.txt"

                                        what you want the user will show in the QFileDialog?
                                        how the user will navigate to the paths if he will not see the folders (of the file system)

                                        please explain in more details as you can, what you are asking for and what you want the user will see, and if you have a image or you see your request working some where please refer to it

                                        1 Reply Last reply
                                        0
                                        • S Offline
                                          S Offline
                                          SherifOmran
                                          wrote on last edited by
                                          #26

                                          I want the user to see all folders but when he gets inside it, he does not see except only the abc.txt file to select it, all other files are hidden. something like in any open file in a windows program, say winword in the open window one sees *.doc but I can write abc.doc in the window and it will be filtered automatically.

                                          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