如何在QTreeWidget的孩子身上正确显示QIcon



我成功地在TopLevelItem上显示了QIcon。但问题来了,什么时候在孩子身上添加图标,我该怎么做?

下面是我正在构建的示例的一个片段:

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTreeWidgetItem *top1 = new QTreeWidgetItem({ "Images" });
QTreeWidgetItem *top2 = new QTreeWidgetItem({ "Path" });
QTreeWidgetItem *top3 = new QTreeWidgetItem({ "Segmentation" });
QList<QTreeWidgetItem*> children1;
QList<QTreeWidgetItem*> children2;
QList<QTreeWidgetItem*> children3;
children1.append(new QTreeWidgetItem({ "Original" }));
children1.append(new QTreeWidgetItem({ "Sample" }));
children1.append(new QTreeWidgetItem({ "Black/White" }));
children2.append(new QTreeWidgetItem({ "Left Side" }));
children2.append(new QTreeWidgetItem({ "Right Side" }));
children2.append(new QTreeWidgetItem({ "Center Side" }));
children3.append(new QTreeWidgetItem({ "Edge Detection" }));
children3.append(new QTreeWidgetItem({ "Clustering" }));
children3.append(new QTreeWidgetItem({ "Region-Based" }));
children3.append(new QTreeWidgetItem({ "Mask RNN" }));
top1->addChildren(children1);
top1->setIcon(0, QIcon("/home/ultrasound_mapper/laserscan.png"));
top2->addChildren(children2);
top2->setIcon(0, QIcon("/home/ultrasound_mapper/laserscan.png"));
top3->addChildren(children3);
top3->setIcon(0, QIcon("/home/ultrasound_mapper/laserscan.png"));
ui->treeWidget->addTopLevelItems({ top1, top2, top3 });
}

到目前为止我所做的:

我浏览了下面的帖子,它帮助我管理TopLevelItem的图标,但当我试图为孩子们做同样的事情时,我没有同样的运气。

我用QList以以下方式照顾所有的孩子:

QList<QTreeWidgetItem*> children1;

我现在想知道这是否是一个好的方法,因为没有添加图标。当然,我尝试了以下方法,但没有成功:

children1->setIcon(0, QIcon("/home/ultrasound_mapper/laserscan.png"));

因为setIcon不是选择中的成员函数,我想知道是否有更详细的程序可以做到这一点。

我也用过这个,这个,但是没有一个有用。

感谢你为解决这个问题指明了正确的方向。

回答您的问题

要访问项目的子项,您需要使用QTreeWidgetItem::child:

top1->child(0)->setIcon(0, QIcon("/home/ultrasound_mapper/laserscan.png"));

正确的解决方案

话虽如此,我会以另一种方式来处理这个问题。

我会创建一个助手函数,例如:

QTreeWidgetItem *createItem(const QString &name, const QString &iconPath)
{
auto *item = new QTreeWidgetItem(name);
item->setIcon(0, QIcon(iconPath));
return item;
}

然后我会这样使用它:

top1->addChild(createItem("Original", "/home/ultrasound_mapper/laserscan.png"));
top1->addChild(createItem("Sample", "/home/ultrasound_mapper/laserscan.png"));
...

并且没有必要与孩子们一起保留一个列表,因为他们可以通过child方法进行访问。

示例

以下是如何在您的情况下应用建议的解决方案:

auto *top1 = createItem("Images", "/home/ultrasound_mapper/laserscan.png");
auto *top2 = createItem("Path", "/home/ultrasound_mapper/laserscan.png");
auto *top2 = createItem("Segmentation", "/home/ultrasound_mapper/laserscan.png");
top1->addChild(createItem("Original", "/home/ultrasound_mapper/laserscan.png"));
top1->addChild(createItem("Sample", "/home/ultrasound_mapper/laserscan.png"));
top1->addChild(createItem("Black/White", "/home/ultrasound_mapper/laserscan.png"));
top2->addChild(createItem("Left Side", "/home/ultrasound_mapper/laserscan.png"));
top2->addChild(createItem("Right Side", "/home/ultrasound_mapper/laserscan.png"));
top2->addChild(createItem("Center Side", "/home/ultrasound_mapper/laserscan.png"));
top3->addChild(createItem("Edge Detection", "/home/ultrasound_mapper/laserscan.png"));
top3->addChild(createItem("Clustering", "/home/ultrasound_mapper/laserscan.png"));
top3->addChild(createItem("Region-Based", "/home/ultrasound_mapper/laserscan.png"));
top3->addChild(createItem("Mask RNN", "/home/ultrasound_mapper/laserscan.png"));
ui->treeWidget->addTopLevelItems({ top1, top2, top3 });

正如您所看到的,代码变得更加干净和可维护。

注意:当然可以放正确的图像。但是,如果您想只使用一个图像,则可以省略iconPath参数,并将固定图像设置为图标。

最新更新