2016-12-16 69 views
0

我正在使用QTreeWidget列出文件夾。我寫了下面的代碼,它看起來像圖片。在Qt c + +中使用Qtreewidget列出文件夾

但是,我不希望它像這樣顯示。我想添加一個框圖標,並在框的左側添加一條虛線。我在我想要做的代碼下面添加了一張圖片。它怎麼能這樣顯示。

enter image description here

QTreeWidgetItem *topLevelItem = NULL; 

foreach (const QString &fileName, fileNames) 
{ 
    QList<QString> splitFileName; 
    splitFileName.append(fileName.split("/")); 


    // add root folder as top level item if treeWidget doesn't already have it 
    if (ui->treeWidget->findItems(splitFileName[0], Qt::MatchFixedString).isEmpty()) 
    { 
     topLevelItem = new QTreeWidgetItem; 
     topLevelItem->setText(0, splitFileName[0]); 
     ui->treeWidget->addTopLevelItem(topLevelItem); 
    } 

    QTreeWidgetItem *parentItem = topLevelItem; 

    // iterate through non-root directories (file name comes after) 
    for (int i = 1; i < splitFileName.size() - 1; ++i) 
    { 
    // iterate through children of parentItem to see if this directory exists 
    bool thisDirectoryExists = false; 

    for (int j = 0; j < parentItem->childCount(); ++j) 
    { 
     if (splitFileName[i] == parentItem->child(j)->text(0)) 
     { 

      thisDirectoryExists = true; 
      parentItem = parentItem->child(j); 
      break; 
     } 
    } 
    if (!thisDirectoryExists) 
    { 
     parentItem = new QTreeWidgetItem(parentItem); 
     parentItem->setText(0, splitFileName[i]); 

    } 
} 


    if(splitFileName.last()!="") 
    { 
     QTreeWidgetItem *childItem = new QTreeWidgetItem(parentItem); 
     childItem->setText(0, splitFileName.last()); 
    } 

} 

     fileNames.clear(); 
} 

我想這是如下

enter image description here

回答

1

有2個可能的解決方案(從http://www.qtcentre.org/threads/9155-how-to-add-icons-to-QTreeWidget代碼):

在運行過程中設置的圖標您的項目:

QTreeWidget Tree; 
QTreeWidgetItem *item ; 
item = new QTreeWidgetItem(Tree); 
item->setText(0, text); 
item->setIcon(0, QIcon("your icon path or file name ")); 
item->setExpanded(true); 

定製型號:

如果你想要更多的自由,你必須創建自己的實現的QAbstractItemModel,因爲你的節點都會有不同的圖形狀態取決於它們內部的數據。

很好的教程,開始與:http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

在哪裏把你的裝飾:

QVariant YourModel::data(const QModelIndex &index, int role) const 
{ 
    ... 
    switch (role) 
    { 
     ... 
     case Qt::DecorationRole: // <--- 
      return QIcon(...); // <--- 
     ... 
    } 
    ... 
} 

對於盒子圖標

這個主題是隨基本的Windows Forms程序的TreeView控制,因爲它是樹視圖控件的舊外觀。可能有一些方法來觸發它,因爲它存在於Windows內部,但我不知道如何。