问题描述
我成功地在QIcon
上显示了TopLevelItem
。
但是问题出在何时在孩子上添加图标,我该怎么做?
下面是我正在构建的示例的片段:
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 });
}
到目前为止我所做的:
我经历了以下post,它帮助我管理了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("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
参数,并将固定图像设置为图标。