【问题标题】:Failing to display .mp3 file inside QTreeView无法在 QTreeView 中显示 .mp3 文件
【发布时间】:2012-11-22 15:48:53
【问题描述】:

我的 .ui 中有 2 个树视图。一个树视图是DriveView,另一个是DriveListView。现在我已经编写了一个代码,它在“DriveView”中显示我系统的驱动器。我做了如下:

// 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);
}

现在,一旦我单击 DriveView 中的特定驱动器,它就会显示其中的子文件夹。我基本上需要做的是迭代/遍历整个驱动器并在里面搜索.mp3 文件。基本上检查所有文件夹和子文件夹。一旦找到文件,它应该在我的另一个 Treeview 中显示它们,即DriveListView。我为此编写了以下代码:

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")
        {
            qDebug()<<dirIt.filePath();
            m_list<<dirIt.filePath();
            m_list.append(dirIt.filePath());
        }
    }

    QStringListModel *model = new QStringListModel();
    model->setStringList(m_list);
    m_SystemListViewModel->setNameFilterDisables(false);
}
}

每当我单击包含 mp3 文件的子文件夹时,它都会在树视图中显示它们。这是我面临的问题。当我单击邮件文件夹时,什么都没有显示。理想情况下,我想显示主文件夹及其子文件夹中存在的所有 mp3 文件。我已经输入了qDebug()&lt;&lt;dirIt.filePath();,当我运行应用程序并单击驱动器时,这会在应用程序输出中打印出所有.mp3 文件,但它不会在树视图中显示它们,即DriveListView

【问题讨论】:

  • 你之前的问题有什么问题,所以你不得不写一个新的?
  • @troyane:仍然没有找到合适的答案。如果您能提供帮助,我将不胜感激
  • @KamilKlimek:仍然没有找到正确的答案。花了很多时间找出问题,但失败了。
  • 这不是 stackoverflow 的工作方式。您不应该仅仅因为没有得到您喜欢的答案就向您提出关于同一件事的新问题。

标签: c++ qt qt4 treeview


【解决方案1】:

由于无论如何您都在手动迭代所有子目录,请尝试使用QStringListModel 代替m_SystemListViewModel。这样就可以在视图中直接显示m_list。见http://qt-project.org/doc/qt-4.8/qstringlistmodel.html

另外,看起来QSortFilterProxyModel 可能用于过滤列表视图中显示的结果,但我从未使用过它。见http://qt-project.org/doc/qt-4.8/qsortfilterproxymodel.html

【讨论】:

  • 好吧,当我使用QStringListModel 时,它会显示所有 .mp3 文件,但仅在单击文件夹时才会显示。我的意思是Songs--&gt; Folder1, Folder 2. 如果我点击Folder1 它会在其中显示mp3 文件,同样如果我点击Folder2 它会显示mp3 文件。但是当我点击Songs 时,什么都没有显示。理想情况下,我希望在单击 Songs 文件夹时显示 Folder1、folder2 等中存在的所有文件。你明白我想说什么吗? :)
  • on_DriveView_clicked 中,您现在每次都创建一个新的QStringModel,但您没有将其分配给视图。在onCamStartup 中尝试m_SystemListViewModel = new QStringListModel(this),然后在on_DriveView_clicked:m_SystemListViewModel-&gt;setStringList(m_list); 中设置字符串列表
  • 所以你的意思是我需要在头文件中将 m_SystemListViewModel 设置为QStringListModel 还是什么???我试过这样做但抛出错误cannot convert 'QStringListModel*' to 'QFileSystemModel*' in assignment'class QFileSystemModel' has no member named 'setStringList',因为它的类型是 QFileSystemModel
  • 是的,您还需要将标头声明更改为QStringListModel*。关键是您只需初始化模型并将其分配给视图一次,然后在选择目录时更新模型的内容。这样,您将看到在子目录中找到并存储在m_list 中的所有文件。
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
相关资源
最近更新 更多