从Qgraphicsscene删除自定义Qgraphicsitem时遇到问题

时间:2019-03-20 17:03:29

标签: qt qt5 qgraphicsscene qgraphicsitem

我对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);
      }
}

对不起,我是新手,没有程序员,那是我的第一个子类。有人知道如何实现吗?谢谢。 :-)

1 个答案:

答案 0 :(得分:0)

我没有看到更多的代码。但是猜测是,当您删除类型为chord的项目时,您仍然可以看到已添加到QGraphicsItem场景中的各种chord::addchord。如果是这样,可能是由于chord与这些项目之间缺少任何父子关系:来自QGraphicsScene::removeItem(item)的文档...

  

从场景中删除项目项目及其所有子项。

尝试通过将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);
    }
}

它可能无法解决所有问题,但应该(希望)向正确的方向前进。