从 Qgraphicsscene 中删除自定义 Qgraphicsitem 时出现问题
Problems removing custom Qgraphicsitem from Qgraphicsscene
我已经对 Qgraphicsscene 和 Qgraphicsitem 进行了子类化,它似乎可以工作,但是尝试通过子类识别来删除这些项目是行不通的。
这将删除项目:
void debugSceneItemscuatrobis()
{
QList<QGraphicsItem *> allitems = items();
foreach(auto item, allitems) {
removeItem(item);
}
}
但这并没有,它识别出有项目但不删除它们,尝试了不同的可能性但无法使其工作。
void debugSceneItemscuatrotris()
{
QList<QGraphicsItem *> allitems = items();
foreach(auto item, allitems) {
if(item->type() == chord::Type) {
removeItem(item);
delete item;
}
}
}
这是 qgraphicsitem 子类添加项目的方式:
void chord::addchord(QPointF sp)
{
scene()->addLine(sp.x(), sp.y(), sp.x()+10, sp.y()+10);
QList<int> midics = {10, 30, 40};
for(int i = 0; i < midics.length(); i++)
{
QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n");
item->setFont(QFont("omheads", 20));
item->setPos(sp.x(), sp.y()+midics[i]);
scene()->addItem(item);
coso.append(item);
}
}
抱歉,我是新手,不是程序员,这些是我的第一个子类。有人知道如何处理它吗?谢谢。 :-)
没有看到更多你的代码,我只是猜测。但这种猜测是,当您删除 chord
类型的项目时,您仍然能够看到在 chord::addchord
中添加到场景中的各种 QGraphicsItem
。如果是这样,可能是由于 chord
和那些项目之间缺少任何 parent/child 关系:来自 QGraphicsScene::removeItem(item)
...
的文档
Removes the item item and all its children from the scene.
尝试通过将 chord:addchord
实现更改为...
来显式创建 parent/child 关系
void chord::addchord (QPointF sp)
{
auto *line = scene()->addLine(sp.x(), sp.y(), sp.x() + 10, sp.y() + 10);
line->setParentItem(this);
QList<int> midics = { 10, 30, 40 };
for (int i = 0; i < midics.length(); i++)
{
QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n", this);
item->setFont(QFont("omheads", 20));
item->setPos(sp.x(), sp.y() + midics[i]);
scene()->addItem(item);
coso.append(item);
}
}
它可能无法解决所有问题,但应该(希望)引导您朝着正确的方向前进。
我已经对 Qgraphicsscene 和 Qgraphicsitem 进行了子类化,它似乎可以工作,但是尝试通过子类识别来删除这些项目是行不通的。 这将删除项目:
void debugSceneItemscuatrobis()
{
QList<QGraphicsItem *> allitems = items();
foreach(auto item, allitems) {
removeItem(item);
}
}
但这并没有,它识别出有项目但不删除它们,尝试了不同的可能性但无法使其工作。
void debugSceneItemscuatrotris()
{
QList<QGraphicsItem *> allitems = items();
foreach(auto item, allitems) {
if(item->type() == chord::Type) {
removeItem(item);
delete item;
}
}
}
这是 qgraphicsitem 子类添加项目的方式:
void chord::addchord(QPointF sp)
{
scene()->addLine(sp.x(), sp.y(), sp.x()+10, sp.y()+10);
QList<int> midics = {10, 30, 40};
for(int i = 0; i < midics.length(); i++)
{
QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n");
item->setFont(QFont("omheads", 20));
item->setPos(sp.x(), sp.y()+midics[i]);
scene()->addItem(item);
coso.append(item);
}
}
抱歉,我是新手,不是程序员,这些是我的第一个子类。有人知道如何处理它吗?谢谢。 :-)
没有看到更多你的代码,我只是猜测。但这种猜测是,当您删除 chord
类型的项目时,您仍然能够看到在 chord::addchord
中添加到场景中的各种 QGraphicsItem
。如果是这样,可能是由于 chord
和那些项目之间缺少任何 parent/child 关系:来自 QGraphicsScene::removeItem(item)
...
Removes the item item and all its children from the scene.
尝试通过将 chord:addchord
实现更改为...
void chord::addchord (QPointF sp)
{
auto *line = scene()->addLine(sp.x(), sp.y(), sp.x() + 10, sp.y() + 10);
line->setParentItem(this);
QList<int> midics = { 10, 30, 40 };
for (int i = 0; i < midics.length(); i++)
{
QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem("n", this);
item->setFont(QFont("omheads", 20));
item->setPos(sp.x(), sp.y() + midics[i]);
scene()->addItem(item);
coso.append(item);
}
}
它可能无法解决所有问题,但应该(希望)引导您朝着正确的方向前进。