Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Qt Academy Launch in California!

    To select multiple files and dirs using the same QFileDialog.

    General and Desktop
    5
    6
    19637
    Loading More Posts
    • 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.
    • N
      nehaR last edited by

      Hi All,

      I am working on Qt4.6 on mac os. What i want is, whenever i will open QFileDialog I will able to select both files and folders in the same filedialog at a time and also multiple selection of files and folders.

      I tried to subclass QFileDialog for this but it not opens nativeDialog.

      Is there any other way to open files and folders in the same QFileDialog.

      Regards,
      Neha

      1 Reply Last reply Reply Quote 0
      • I
        ijabZhan last edited by

        I encountered the same questions. And I found a solution after googling in QT forums. The following is the codes that you could try(The original link is http://www.qtcentre.org/threads/34226-QFileDialog-select-multiple-directories?p=220108#post220108):

        @QFileDialog* _f_dlg = new QFileDialog(this);
        _f_dlg->setFileMode(QFileDialog::Directory);
        _f_dlg->setOption(QFileDialog::DontUseNativeDialog, true);

        // Try to select multiple files and directories at the same time in QFileDialog
        QListView l = _f_dlg->findChild<QListView>("listView");
        if (l) {
        l->setSelectionMode(QAbstractItemView::MultiSelection);
        }
        QTreeView t = _f_dlg->findChild<QTreeView>();
        if (t) {
        t->setSelectionMode(QAbstractItemView::MultiSelection);
        }

        int nMode = _f_dlg->exec();
        QStringList _fnames = _f_dlg->selectedFiles();@

        1 Reply Last reply Reply Quote 0
        • A
          andre last edited by

          For such a selection, I find that using a custom dialog works better. I like having checkboxes in the tree for that, and I wrote a "proxy model":/wiki/QSortFilterProxyModel_subclass_to_add_a_checkbox to support doing that. However, that does mean crafting your own dialog box for the selection. The default platform one does not support it anyway. In my case, I opted to just include the whole tree view in my wizard itself.

          1 Reply Last reply Reply Quote 0
          • F
            francomartins last edited by

            try is option :
            @
            QStringList ls = QFileDialog::getOpenFileNames();
            @
            return a QStringList of the selecteds Files .

            1 Reply Last reply Reply Quote 0
            • F
              Frodox last edited by

              I have the same question.
              I found this thread hardly, and ijabZhan's solution looks like what I need.. but it did not work correctly :(
              I cannot select just one(or more) file, or 'file + folder' (in this direction).
              I must select 'folder + file'. It didn't suit me, and the problem was in
              @
              void QFileDialog::accept () [virtual protected]
              @

              method (you could look in Qt's src ;-) ).

              Luckily, I found a solution but in reality it consist of two solutions: above and founded.

              Let's subclass QFileDialog:

              sfdfiledialog.h
              @
              #ifndef SFDFILEDIALOG_HP
              #define SFDFILEDIALOG_HP

              #include <QFileDialog>

              // SelectFileDirDialog
              class SFDFileDialog : public QFileDialog
              {
              Q_OBJECT
              public:
              SFDFileDialog(QWidget * parent, Qt::WindowFlags flags );
              SFDFileDialog(QWidget * parent = 0, const QString & caption = QString(),
              const QString & directory = QString(),
              const QString & filter = QString() );
              ~SFDFileDialog();

              public slots:
              void accept ();
              };

              #endif // SFDFILEDIALOG_HP
              @

              sfdfiledialog.cpp
              @
              #include "sfdfiledialog.h"
              #include <QListView>
              #include <QTreeView>

              SFDFileDialog::SFDFileDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter)
              : QFileDialog(parent, caption, directory, filter)
              {
              // Try to select multiple files and directories at the same time in QFileDialog
              QListView l = this->findChild<QListView>("listView");
              if (l)
              l->setSelectionMode(QAbstractItemView::ExtendedSelection);

              QTreeView *t = this->findChild<QTreeView*>();
              if (t)
                  t->setSelectionMode(QAbstractItemView::ExtendedSelection);
              

              }

              SFDFileDialog::SFDFileDialog(QWidget *parent, Qt::WindowFlags flags)
              : QFileDialog(parent,flags)
              {
              }

              SFDFileDialog::~SFDFileDialog()
              {
              }

              void SFDFileDialog::accept()
              {
              QStringList files = selectedFiles();
              if (files.isEmpty())
              return;
              emit filesSelected(files);
              QDialog::accept();
              }
              @

              And now you can use it as you want, for example:
              @
              SFDFileDialog *file_dlg = new SFDFileDialog(this, "Select files:");
              file_dlg->setFileMode(QFileDialog::ExistingFiles);

              if ( !file_dlg->exec() ) {
              qDebug() << "You select nothing.";
              return;
              }
              QStringList _fnames = file_dlg->selectedFiles();

              // debug
              QStringList::const_iterator it;
              for (it = _fnames.begin(); it != _fnames.end(); it++)
              qDebug() << *it;
              qDebug() << "-----------";

              ...
              delete file_dlg;
              @

              As you noticed, I implanted ijabZhan ’s solution in Constructor of SFDFileDialog, because IMHO it's logically must be there and we have a great chance :) Also you could move it from Constructor, and call later (if you need multi-selection) as in ijabZhan’s post.

              Solution was founded here:
              http://www.qtcentre.org/threads/4810-QFileDialog-how-to-choice-File-or-Directory-in-the-same-Dialog

              I hope it will help someone.

              With Best Regards,
              Frodox (:

              1 Reply Last reply Reply Quote 0
              • F
                Frodox last edited by

                P.s. It work correctly for Qt 4.7.4 and I think for lesser versions too.
                In 4.8.4 dialog close after clicking on 1 file, so it need some other hints.

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post