如何从QFileSystemModel获取文件路径?

时间:2017-12-18 08:44:25

标签: qt

首先,假设有一个存储多个图像的文件夹。然后我尝试单击UI中的按钮以打开文件夹,然后将该文件夹中图像的所有文件路径保存到QList(仅过滤的图像文件)中。但是QList并没有存储任何东西。请帮忙。

void MainWindow::on_pushButton_clicked()
{
    QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
                                                 "/home",
                                                 QFileDialog::ShowDirsOnly
                                                 | QFileDialog::DontResolveSymlinks);
    model = new QFileSystemModel();
    filesPath = dir;
    model->setRootPath(dir);
    QStringList filter;
    filter <<"*.png" <<"*.jpg" <<"*.bmp" <<"*.gif";
    model->setNameFilters(filter);
    model->setNameFilterDisables(false);

    ui->treeView->setModel(model);
    ui->treeView->setRootIndex(model->index(dir));
    ui->treeView->setAnimated(false);
    ui->treeView->setSortingEnabled(true);   

    QList<QString> path_list;
    QModelIndex parentIndex = model->index(dir);
    int numRows = model->rowCount(parentIndex);

    for (int row = 0; row < numRows; ++row) {
        QModelIndex childIndex = model->index(row, 0, parentIndex);
        QString path = model->data(childIndex).toString();
        if(!QFileInfo(path).isDir())
            path_list.append(path);
    }
}

2 个答案:

答案 0 :(得分:1)

正如评论中所述,QFileSystemModel并未设计为像这样使用。这里的关键在于你所指向的文档(强调我的):

  

与QDirModel不同,QFileSystemModel使用单独的线程来填充自身,因此在查询文件系统时不会导致主线程挂起。 调用rowCount()将返回0,直到模型填充目录。

如果您绝对想要使用QFileSystemModel来构建列表,则必须将函数连接到directoryLoaded(const QString &path)信号,并在加载后添加每个文件夹中的文件。但是可能有更好的方法来完成你需要的东西。

答案 1 :(得分:1)

如果您使用QDir::entryList()代替适当的过滤器,则可以实现您的目标,并且代码和开销更少。