Проблемы с удалением пользовательского Qgraphicsitem из Qgraphicsscene - PullRequest
0 голосов
/ 20 марта 2019

Я вложил в подкласс 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 голосов
/ 20 марта 2019

Не видя больше вашего кода, я только догадываюсь.Но это предположение может заключаться в том, что при удалении элемента типа chord вы все равно сможете увидеть различные QGraphicsItem, которые были добавлены на сцену в chord::addchord.Если это так, то, вероятно, это связано с отсутствием каких-либо родительских / дочерних отношений между chord и этими элементами: из документации для QGraphicsScene::removeItem(item) ...

Удаляетitem 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);
    }
}

Возможно, это не решит все проблемы, но должно (надеюсь) направить вас в правильном направлении.

...