0

我想遍历系统中存在的驱动器并搜索其中的音频/视频文件。基本上遍历子目录并在树视图中显示文件。我有 2 个树视图,一个用于显示系统目录,另一个用于显示音频/视频文件。

// Displays System Drives inside TreeView(Drive View) When Application Starts
void PanasonicViewer::onCamStartup()
{
    m_SystemModel = new QFileSystemModel(this);
    m_SystemListViewModel = new QFileSystemModel(this);
    m_SystemModel->setRootPath(QDir::currentPath());
    ui->DriveView->setModel(m_SystemModel); //Left side TreeView
    ui->DriveListView->setModel(m_SystemListViewModel); //Right Side TreeView

    // regard less how many columns you can do this using for:
    for(int nCount = 1; nCount < m_SystemModel->columnCount(); nCount++)
       ui->DriveView->hideColumn(nCount);
}

//On Clicking The TreeView, it should display Audio and Video files in DriveListView
void PanasonicViewer::on_DriveView_clicked(const QModelIndex &index)
{
    QStringList sDriveFilters;

    QString sPath = m_SystemModel->fileInfo(index).absoluteFilePath();
    ui->DriveListView->setRootIndex(m_SystemListViewModel->setRootPath(sPath));    

    m_SystemModel->setRootPath(QDir::currentPath());
    m_SystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs );
    m_SystemListViewModel->setFilter( QDir::Files | QDir::NoDotAndDotDot );

    sDriveFilters << "*.aac" << "*.wmv" << "*.avi" << "*.mpeg" << "*.mov" << "*.3gp" << "*.flv" << "*.mp3" ;

    m_SystemListViewModel->setNameFilters(sDriveFilters);
    m_SystemListViewModel->setNameFilterDisables(false);
}

您可以在上面的单击事件中注意到我已将过滤器设置为选定的扩展。当我单击驱动器即 E:\ 但不显示子文件夹中存在的文件时,这似乎可以工作并显示音频和视频文件。我哪里错了?

4

3 回答 3

0

问题是由于您的设置QFileSystemModel::filter.

的默认设置是QDir::AllEntries | QDir::NoDotAndDotDot | QDir::AllDirs,其中QDir::AllEntries转换为QDir::Dirs | QDir::Files | QDir::Drives。如果我们展开它,默认设置是:

QDir::Dirs | QDir::Files | QDir::Drives | QDir::NoDotAndDotDot | QDir::AllDirs

通过调用m_SystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs ),您告诉模型您只想查看标准目录,并希望排除所有文件。只需setFilter完全删除您的电话,就可以了。

于 2012-11-19T18:11:25.920 回答
0

你所期望的不是标准QFileSystemModel应该做的。您需要的是手动递归提取多媒体文件QStringListModel并将其设置在您的QListView,或直接使用QListWidget枚举时直接添加项目。当QFileSystemModel更改的选择时,您可以获取所选文件夹的路径,并递归列举文件和子文件夹文件。请注意,如果您单击某个驱动器,您最终将等待驱动器中的所有多媒体文件。如果这是您想要的,那么也许您可以考虑在工作线程中进行枚举,这并不容易。

于 2014-05-28T09:27:24.167 回答
0

尝试改变

ui->DriveListView->setRootIndex(m_SystemListViewModel->setRootPath(sPath));

m_SystemListViewModel->setRootPath(sPath)
ui->DriveListView->setRootIndex(m_SystemListViewModel->index(sPath);

我怀疑返回的 QModelIndex 是否setRootPath是您认为的那个。通过从 m_SystemListViewModel 中删除过滤器来解决此问题,以确保您实际上正在查看您认为的文件夹。

我知道如果 sPath 是目录路径,这应该可以工作。如果它是文件路径,我不确定它是否会按预期工作。

于 2012-11-19T21:48:01.047 回答