首先,假设有一个存储多个图像的文件夹。然后我尝试单击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);
}
}
答案 0 :(得分:1)
正如评论中所述,QFileSystemModel
并未设计为像这样使用。这里的关键在于你所指向的文档(强调我的):
与QDirModel不同,QFileSystemModel使用单独的线程来填充自身,因此在查询文件系统时不会导致主线程挂起。 调用rowCount()将返回0,直到模型填充目录。
如果您绝对想要使用QFileSystemModel
来构建列表,则必须将函数连接到directoryLoaded(const QString &path)
信号,并在加载后添加每个文件夹中的文件。但是可能有更好的方法来完成你需要的东西。
答案 1 :(得分:1)
如果您使用QDir::entryList()
代替适当的过滤器,则可以实现您的目标,并且代码和开销更少。