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

Posted

技术标签:

【中文标题】如何在 QTreeWidget 孩子上正确显示 QIcon?【英文标题】:How to properly show QIcon on a QTreeWidget child? 【发布时间】:2021-01-24 23:23:27 【问题描述】:

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

在我正在构建的示例中的 sn-p 下方:

ma​​inwindow.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 不是选项中的成员函数,我想知道是否有更详细的过程来执行此操作。

我也使用了this、this,但它们都没有用。

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

【问题讨论】:

children1[0]-&gt;setIcon(0, QIcon("/home/ultrasound_mapper/laserscan.png")); 工作吗? 感谢您访问并阅读问题! :) 不幸的是,您的建议不起作用。什么都没有发生。 【参考方案1】:

回答您的问题

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

【讨论】:

:) 是的,行得通!感谢您停下来阅读这个问题!非常感谢! :) @Emanuele,不客气!顺便说一句,您不妨阅读我的答案中的补充内容以获得更好的解决方案。 @Emanuele,我还添加了一个示例,说明如何在您的案例中使用建议的解决方案。 你提出的辅助函数是个好主意!!!你的额外解释让它超级清楚!非常感谢您的宝贵时间,周末愉快!! :) :) @Emanuele,很高兴你喜欢它!也祝你周末愉快!

以上是关于如何在 QTreeWidget 孩子上正确显示 QIcon?的主要内容,如果未能解决你的问题,请参考以下文章

孩子的 QTreeWidget 样式表颜色

在 PyQt 中使用拖放重新排序 QTreeWidget 中的项目

如何在 QTreeWidget 中设置小列宽?

如何获取 QTreeWidget 可见区域中显示的所有项目?

如何对 QTreeWidget 列进行排序?

如何将 QTreeWidget 的子项设置为在单击其父项时自动选择并突出显示