单击任何驱动器时在 TreeView 中显示音频和视频文件 (QFileSystemModel)

Posted

技术标签:

【中文标题】单击任何驱动器时在 TreeView 中显示音频和视频文件 (QFileSystemModel)【英文标题】:Display Audio & Video Files In TreeView on Clicking Any Drive (QFileSystemModel) 【发布时间】:2012-11-19 11:28:14 【问题描述】:

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

【问题讨论】:

【参考方案1】:

问题是由于您为 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-&gt;setFilter(QDir::NoDotAndDotDot | QDir::AllDirs ),您告诉模型您只想查看标准目录,并希望排除所有文件。只需完全删除您对setFilter 的呼叫,您就可以了。

【讨论】:

感谢好友的回复。如上所述,我删除了SetFilter,但它不起作用。仍然不显示音频/视频文件:(【参考方案2】:

尝试改变

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

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

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

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

【讨论】:

感谢您的回复。即使我按照您所说的进行更改,它也不起作用。【参考方案3】:

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

【讨论】:

以上是关于单击任何驱动器时在 TreeView 中显示音频和视频文件 (QFileSystemModel)的主要内容,如果未能解决你的问题,请参考以下文章

单击网页上的链接时在服务器上执行音频播放器

单击时在 Java 中添加类似动态文本区域的对象

如何在通知到达时在任何屏幕上显示自定义对话框?

单击列表视图时在活动中显示不同的信息

winform 中treeview 展开和折叠首层节点时 切换显示图片,类似qq首层节点那样,点击之后箭头图片改变

当 UIsearchBar 点击和键盘显示时在事务中调用