如何在 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
参数并将固定图片设置为图标。
我成功地在 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
参数并将固定图片设置为图标。