如何在QTreeWidget子项上正确显示QIcon?

问题描述

我成功地在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不是选项中的成员函数,所以我想知道是否有更详细的过程来做到这一点。

我还使用了thisthis,但没有一个对这样做有用。

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

解决方法

回答您的问题

要访问某项的子项,您需要使用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参数,并将固定图像设置为图标。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...