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. Filter filename in QDialog
Qt 6.11 is out! See what's new in the release blog

Filter filename in QDialog

Scheduled Pinned Locked Moved General and Desktop
14 Posts 5 Posters 7.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.
  • P Offline
    P Offline
    Peggy
    wrote on last edited by
    #1

    Hello everyone,

    I am trying to set a filter on the name of the files which are being shown by clicking on Open menu.
    From one side I saved all the files on a directory. But on the other hand I saved the name of some of them in the Database. Now I want to have a QDialog which shows only the files, that their names existed already in Database. My problem is I want to set a filter that can filter my files. I don't know how I can manage this filter.

    I am looking forward for some tips.

    1 Reply Last reply
    0
    • B Offline
      B Offline
      broadpeak
      wrote on last edited by
      #2

      Get the filenames from your database into a QStringList.
      And pass this stringlist into this method:
      void QFileDialog::setNameFilters ( const QStringList & filters )

      1 Reply Last reply
      0
      • G Offline
        G Offline
        gRicky
        wrote on last edited by
        #3

        How to filter the name in a QFileDialog
        @

            QDate date = QDate::currentDate();
            QString dateString = date.toString("yyyy-MM-dd");
        
            QTime time = QTime::currentTime();
            QString timeString = time.toString();
        
            QFileDialog *fd  = new QFileDialog;
            fd->selectFile&#40;dateString + "_" + timeString + "_log.csv"&#41;; //<- sets the name of the file on the QFile dialog
        
            fd->setFilters(QStringList() << "*.csv"); //<- sets the filter of the extention file
            if (fd->exec&#40;&#41;) //<- show the QFileDialog
                m_logFileName = fd->selectedFiles()[0]; //+ fd->selectedFilter(); // <- gets teh first of the file selected by the user
            qDebug() << m_logFileName; //<- show into the debug window the selected filename
        

        @

        I hope this code help you to understand.

        1 Reply Last reply
        0
        • P Offline
          P Offline
          Peggy
          wrote on last edited by
          #4

          Hello broadpeak,

          I tried it but it does not work :( For example I have 4 files which have been saved in temp directory and just the name of two of them in the database (test_pro1,test_pro2). The code is as following:
          @
          QFileDialog dialog(this);
          QStringList lst;
          lst<<"test_pro1"<<"test_pro2";
          dialog.setFilters(lst);
          dialog.getOpenFileName(this,tr("Open the files"),QDir("temp").absolutePath());
          @

          I currently read that by overriding proxymodel on QDir, the filtering would be possible. But it is not also exactly what I am looking for:(

          1 Reply Last reply
          0
          • B Offline
            B Offline
            broadpeak
            wrote on last edited by
            #5

            [quote author="Peggy" date="1350649293"]
            dialog.setFilters(lst);
            [/quote]

            I think, setNameFilters will be your friend (and not the setFilters!)

            1 Reply Last reply
            0
            • G Offline
              G Offline
              gRicky
              wrote on last edited by
              #6

              I think it too.

              1 Reply Last reply
              0
              • P Offline
                P Offline
                Peggy
                wrote on last edited by
                #7

                I tried setNameFilters and the tip from gRicky. It does not work as I want. It showed all the files in the directory which I don't want.

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

                  How about you show us your new code?

                  1 Reply Last reply
                  0
                  • P Offline
                    P Offline
                    Peggy
                    wrote on last edited by
                    #9

                    Here is my code:
                    @
                    QFileDialog* dialog = new QFileDialog;
                    QStringList dbLst;
                    dbLst<<"project1"<<"project2";
                    for (QStringList::iterator it = dbLst.begin();it != dbLst.end(); it++){
                    QString str = it;
                    }
                    dialog->setFilters(QStringList()<< "
                    .cst");
                    dialog->setDirectory(QDir("Template").absolutePath());
                    dialog>exec();

                    @

                    I used the Iterator to see the content of my list,which of course is in this example is not useful.

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

                      @
                      QFileDialog* dialog = new QFileDialog;
                      QStringList dbLst;
                      dbLst<<"project1"<<"project2";

                      // whats this for-loop for ?

                          for (QStringList::iterator it = dbLst.begin();it != dbLst.end(); it++){
                              QString str = *it;
                          }
                      

                      //you are not using setNameFilters and also you are handing over a stringlist containing only ".cst" as the parameter. I thought you were looking for names containing "project1" or "project2".
                      dialog->setFilters(QStringList()<< "
                      .cst");
                      dialog->setDirectory(QDir("Template").absolutePath());
                      dialog>exec();

                      @

                      Please have a look at "the documentation":http://qt-project.org/doc/qt-4.8/qfiledialog.html#setNameFilters and think about want you want to achieve before wildly copying code together.

                      1 Reply Last reply
                      0
                      • P Offline
                        P Offline
                        Peggy
                        wrote on last edited by
                        #11

                        I think what I am looking for is hardly being solved by setting filter(at least I can not solve it with filter). I will write an extra class with inherits QDialog and try to write some methods to solve my problem.

                        Thank you all for taking your time to help me:)

                        1 Reply Last reply
                        0
                        • P Offline
                          P Offline
                          Peggy
                          wrote on last edited by
                          #12

                          Hello KA510,

                          You are right with *.cst(my fault). But it does not filter the name I am looking for it either. I may understand the filter in qt not correctly. By clicking on open menu, I was looking for to have a list of files which were filtered according to the existing list in database. So if I have 4 files in the directory which only two of them existed in database I wanted to show just this two files except the 4 files.

                          1 Reply Last reply
                          0
                          • B Offline
                            B Offline
                            butterface
                            wrote on last edited by
                            #13

                            Try this one

                            @
                            QFileDialog* dialog = new QFileDialog;
                            QStringList dbLst;
                            dbLst<<"(project1.cst)"<<"(project2.cst)";
                            dialog->setFilters(dbLst);
                            dialog->setDirectory(QDir("Template").absolutePath());
                            dialog->exec();
                            @

                            EDIT
                            or maybe you need this
                            @
                            QFileDialog* dialog = new QFileDialog;
                            dialog->setNameFilter(QString("My Files (project1.cst project2.cst)"));
                            dialog->setDirectory(QDir("Template").absolutePath());
                            dialog->exec();
                            @

                            1 Reply Last reply
                            0
                            • B Offline
                              B Offline
                              butterface
                              wrote on last edited by
                              #14

                              AFAIK and without RTFM the name of the actual file (project1.cst) or the pattern (*.exe) must be enclosed by brackets.

                              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