如何在 QTreeWidget 孩子上正确显示 QIcon?
Posted
技术标签:
【中文标题】如何在 QTreeWidget 孩子上正确显示 QIcon?【英文标题】:How to properly show QIcon on a QTreeWidget child? 【发布时间】:2021-01-24 23:23:27 【问题描述】:我成功地在TopLevelItem
上显示了QIcon
。
但是问题来了,什么时候给孩子添加图标,我该怎么做呢?
在我正在构建的示例中的 sn-p 下方:
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
不是选项中的成员函数,我想知道是否有更详细的过程来执行此操作。
我也使用了this、this,但它们都没有用。
感谢您指出解决此问题的正确方向。
【问题讨论】:
children1[0]->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?的主要内容,如果未能解决你的问题,请参考以下文章
在 PyQt 中使用拖放重新排序 QTreeWidget 中的项目