在 Qt C++ 中使用 Qtreewidget 列出文件夹
List folders with Qtreewidget in Qt c++
我正在使用 QTreeWidget 列出文件夹。我写了下面的代码,它看起来像图片。
但是,我不希望它显示成这样。我想添加一个框图标,并在框的左侧添加一条虚线。我在我想做的代码下面添加了一张图片。怎么会显示成这样
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();
}
我要如下
有 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 表单程序的 TreeView 控件,因为它是树视图控件的旧外观。可能有一些方法可以触发它,因为它存在于 Windows 中,但我不知道如何触发它。
我正在使用 QTreeWidget 列出文件夹。我写了下面的代码,它看起来像图片。
但是,我不希望它显示成这样。我想添加一个框图标,并在框的左侧添加一条虚线。我在我想做的代码下面添加了一张图片。怎么会显示成这样
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();
}
我要如下
有 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 表单程序的 TreeView 控件,因为它是树视图控件的旧外观。可能有一些方法可以触发它,因为它存在于 Windows 中,但我不知道如何触发它。