单击任何驱动器时在 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->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
应该做的。您需要的是手动递归提取@987654322@中的多媒体文件并将其设置在您的QListView
上,或者在枚举时直接使用QListWidget
直接添加项目。当QFileSystemModel
上的选择发生变化时,您可以获得所选文件夹的路径并递归枚举文件和子文件夹文件。请注意,如果您单击某个驱动器,您最终将等待驱动器中的所有多媒体文件。如果这是您想要的,那么也许您可以考虑在工作线程中进行枚举,这并不容易。
【讨论】:
以上是关于单击任何驱动器时在 TreeView 中显示音频和视频文件 (QFileSystemModel)的主要内容,如果未能解决你的问题,请参考以下文章