2012-11-21 36 views
0

.MP3文件,我在我的.ui 2個樹視圖。一棵樹視圖是DriveView,另一棵是DriveListView。現在我已經編寫了一個代碼,在DriveView中顯示我的系統的驅動器。我已經做如下它:沒有展示的內部QTreeView則

// 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文件的子文件夾時,它都會在treeview中顯示它們。這是我面臨的問題。當我點擊郵件文件夾時,什麼都不顯示。理想情況下,我想顯示主文件夾及其子文件夾中顯示的所有mp3文件。我已經把qDebug()<<dirIt.filePath();,當我運行應用程序,並單擊驅動器,這種打印我的所有應用程序中輸出的文件.mp3,但它並不在TreeView即DriveListView顯示它們。

+0

重複。 http://stackoverflow.com/questions/13473689/fails-to-display-mp3-files-in-treeview-in-qt – troyane

+0

哪些錯誤您剛纔的問題,所以你必須編寫新的? –

+0

@troyane:仍然沒有找到合適的答案。我將不勝感激,如果你能幫助 –

回答

0

因爲無論如何您都要手動迭代所有子代碼,請嘗試使用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

+0

那麼當我使用'QStringListModel'時,它會顯示所有的.mp3文件,但只有當文件夾被點擊時。我的意思是說'歌曲 - >文件夾1,文件夾2'。如果我點擊'文件夾1'它顯示MP3文件,同樣,如果我點擊'文件夾2'它顯示MP3文件。但是當我點擊「歌曲」時,什麼都不顯示。理想情況下,我希望在點擊「歌曲」文件夾時顯示Folder1,folder2等所有文件。你明白我想說什麼? :) –

+0

在'on_DriveView_clicked'您現在正在打造一個新的'QStringModel'每一次,但你不將其分配到一個視圖。在'onCamStartup'中嘗試'm_SystemListViewModel = new QStringListModel(this)',然後在'on_DriveView_clicked'中設置字符串列表:'m_SystemListViewModel-> setStringList(m_list);' –

+0

所以你的意思是我需要在頭文件中將m_SystemListViewModel設置爲'QStringListModel'文件或什麼?我想這樣做,但會拋出錯誤'無法轉換「QStringListModel *」到「QFileSystemModel *」在assignment'和'「類QFileSystemModel」沒有名爲因爲類型的「setStringList''成員QFileSystemModel –