如何在 QTreeWidget child 上正确显示 QIcon?

How to properly show QIcon on a QTreeWidget child?

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

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

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 的图标,但是当我尝试为 children 做同样的事情时,我没有同样的运气。

我用 QList 按以下方式处理所有 children :

QList<QTreeWidgetItem*> children1;

我现在想知道这是否是继续进行的好方法,因为没有添加图标。 当然,我尝试了以下但没有用:

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

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

我也用过 this, this,但其中 none 对这很有用。

感谢您指出解决此问题的正确方向。

回答你的问题

要访问项目的 children,您需要使用 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"));
...

并且不需要使用 children 保留列表,因为它们可以通过 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 参数并将固定图片设置为图标。