在Qt c ++中使用Qtreewidget列出文件夹

时间:2016-12-16 08:17:36

标签: c++ qt qtreewidget qtreewidgetitem

我使用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 个答案:

答案 0 :(得分:1)

有两种可能的解决方案(代码来自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窗体程序&#39; TreeView控件,因为它是树视图控件的旧外观。可能有某种方法可以触发它,因为它存在于Windows中,但我不知道如何。