FindFiles without GUI

  • I want to load all filename-strings of a directory.
    QFileSystemModel *datafolder;
    datafolder= new QFileSystemModel;
    void MainWindow::LoadFiles() {
    connect(datafolder, SIGNAL(directoryLoaded (const QString & )), this, SLOT(LoadFilesOKSlot()));
    datafolder->setRootPath("d:/data"); //tested with lots of different paths..
    void MainWindow::LoadFilesOKSlot() { //slot invoked when QFileSystemModel finished caching the files/dirs...
    int numRows, numCols, i, j;
    QString x;
    QModelIndex ndx= datafolder->index("d:/data"); //tested with lots of different paths..
    numRows = datafolder->rowCount(ndx);
    numCols = datafolder->columnCount(ndx); // <<< breakpoint here for checking the row/col values
    for (i= 0; i < numRows; ++i) {
    for (j= 0; j < numCols; ++j) {
    x= datafolder->data(index(i,j), Qt:: DisplayRole).toString(); // <<< breakpoint here for checking strings

    Code compiles and DOES something: numCols always set to 4, numRows usually 0 or 1. When there is a valuable row, then 1st column is for name, 2nd empty, 3rd is the type, 4th is the date...that's fine

    The problem is that any directory I set by
    @QModelIndex ndx= datafolder->index("d:/data");@
    I get only 1 valuable row, that is for the root of the actual drive, instead of e.g. "D:/data" folder content.
    Sometimes I get more rows (4 and 6 rows already "happened"), but all items are empty except the first row.

    If I connect QFileSystemModel to a QTreeView, everything is fine on the screen.
    How could I get all the filenames in a given directory?

  • I suggest you use QDir class in your case.

  • QFileSystemModel uses lazy loading. I suggest you call "canFetchMore() ": and if that returns true call "fetchMore() ":

  • Why are you using QFileSystemModel instead of QDirIterator?

  • Thanks, Denis,
    I hoped that walking through subdirs would be easier with the QFileSystemModel, but QDir + "manual handling" of sub-directories seems to be proper. I just try to understand why the QFileSystemModel approach wasn't working :)

  • [quote author="Volker" date="1295910280"]QFileSystemModel uses lazy loading. I suggest you call "canFetchMore() ": and if that returns true call "fetchMore() ":[/quote]

    Originally after running setRootPath() I immediately called rowCount() --and got 0 or 1 row.
    When I have found in the doc's that it is in a seperate thread and directoryLoaded() signal is emitted by QFileSystemModel when reading/caching the whole filesystem is ready, I re-wrote the code into a slot function.
    It was suspicious that why is there a canFetchMore(), if slot called when all done ?

  • [quote author="novaktamas" date="1295911687"]It was suspicious that why is there a canFetchMore(), if slot called when all done ?

    This function is virtual in QAbstractItemModel and is reimplemented in QFileSystemModel. It is called when a branch in the tree view is opened that is not yet cached.

  • [quote author="peppe" date="1295910898"]Why are you using QFileSystemModel instead of QDirIterator?[/quote]

    Thanks, Peppe,
    that's the winning idea by now:)) I came from the direction of Borland's c++Builder, and QDirIterator is closest to the good old FindFirst/FindNext. I started flirting with Qt Creator 2 weeks ago, and it's hard to review the so many classes. Sometimes the real one can't be found...

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.