显示音频和放大器TreeView中的视频文件,单击任何驱动器(QFileSystemModel)

时间:2012-11-19 11:28:14

标签: qt qt4 filesystems qfilesystemmodel

我想遍历系统中存在的驱动器并搜索其中的音频/视频文件。基本上遍历子目录并在树视图中显示文件。我有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:\但这并不显示子文件夹中存在的文件时,这似乎工作并显示音频和视频文件。我哪里错了?

3 个答案:

答案 0 :(得分: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的通话,您就可以了。

答案 1 :(得分:0)

尝试更改

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

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

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

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

答案 2 :(得分:0)

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