【问题标题】:Fails to display mp3 files in TreeView in Qt无法在 Qt 的 TreeView 中显示 mp3 文件
【发布时间】:2012-11-08 13:10:22
【问题描述】:

好吧,我似乎遇到了需要遍历目录并仅搜索 .mp3 和 .mpeg 文件的情况。搜索后,我想在我的树视图中显示它们。

基本上我的应用中有 2 个树视图,一个显示系统目录,另一个应该只显示 .mp3 和 .mpeg 文件。

这里是代码

// Gets called when application starts
void DetailView::onCamStartup()
{
m_SystemModel = new QFileSystemModel(this);
m_SystemListViewModel = new QFileSystemModel(this);
m_SystemModel->setRootPath(QDir::currentPath());
ui->DriveView->setModel(m_SystemModel);
ui->DriveListView->setModel(m_SystemListViewModel);

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

// Displays Files in Detail View on Clicking Drive
void DetailView::on_DriveView_clicked(const QModelIndex &index)
{
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 );

QStringList m_list;
QDirIterator dirIt(sPath,QDirIterator::Subdirectories);

while (dirIt.hasNext())
{
    dirIt.next();
    if (QFileInfo(dirIt.filePath()).isFile())
    {
        if (QFileInfo(dirIt.filePath()).suffix() == "mp3" || QFileInfo(dirIt.filePath()).suffix() == "mpeg")
        {
            qDebug()<<dirIt.filePath();
            m_list<<dirIt.filePath();
            m_list.append(dirIt.filePath());
        }
    }

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

DriveView 是显示驱动器的树形视图,DriveListView 是应该只显示 mp3 和 mpeg 文件的树形视图。当我调试代码时,qDebug()&lt;&lt;dirIt.filePath(); 为我提供了Application Output 选项卡中所有 .mp3 和 .mpeg 文件的路径,但不会在 DriveListView(treeview) 中显示它们。到目前为止,它仅显示驱动器中的文件,但驱动器内的子文件夹也有未显示的 mp3 文件。

这是供参考的图片:

请注意 SONGS 中有许多文件夹,其中存在 mp3 文件但不显示。

我哪里搞错了???

【问题讨论】:

    标签: c++ qt qt4 qfilesystemmodel


    【解决方案1】:

    对我来说,这看起来像是对 m_SystemListViewModel-&gt;setFilter( QDir::Files | QDir::NoDotAndDotDot ); 会明确告诉 Qt 只显示文件。

    According to the documentation,您只需使用之前的过滤器传递 QDir::AllDirs

    QDir::AllDirs - 列出所有目录;即不要将过滤器应用于目录名称。

    【讨论】:

    • 是的,你是对的。但是解决方案呢?如何只显示 mp3/mpeg 文件?
    • 您已经只显示 mp3/mpeg 文件。我假设您还想显示文件夹?相应地更新了我的答案。
    • 我不想显示文件夹。我知道我已经在显示 mp3 文件,但只显示主文件夹中的文件,而不是子文件夹中的文件。看看SONGS 文件夹,它在 mp3 文件存在但仍未显示在树视图上的子文件夹中。我的目的是显示主文件夹中存在的所有 mp3 文件,即子文件夹中的文件也应该显示。所以当我单击 SONGS 时,必须显示其中的所有 mp3 文件、子文件夹等。
    【解决方案2】:

    可以尝试不将QFileSystemModel 用于您的m_SystemListViewModel,而是创建您自己的模型来继承QAbstractItemModel,并在其上使用QStyledItemDelegate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      相关资源
      最近更新 更多