2016-12-16 2 views
0

Я перечисляю папку с помощью QTreeWidget. Я написал следующие коды, и это похоже на изображение.Список папок с Qtreewidget в Qt C++

Но, я не хочу, чтобы это отображалось следующим образом. Я хочу добавить значок ящика и добавить пунктирную линию в левую часть поля. Я добавил картинку под кодом, который я хотел сделать. Как он может отображаться следующим образом.

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, но я понятия не имею, как это сделать.

Смежные вопросы