QGraphicsScene - 删除项目 - 清除()崩溃

时间:2014-05-09 11:55:21

标签: clear qgraphicsitem

我有一个QGraphicsScene和按钮。我想删除那些按钮,但方法clear()不起作用。

mainclass.cpp

MainClass::MainClass(QWidget* parent)
  :QMainWindow(parent)
{
  ui.setupUi(this);
  scene = new QGraphicsScene(this);
  ui.graphicsView->setScene(scene);
  QPixMap picture(":/MainClass/Resources/picture.jpg");
  pixmapItem = scene->addPixmap(picture);
  pixmapItem->setFlag(QGraphicsItem::ItemIsMovable);
}

void MainClass::hideButtons();
{
  scene->clear();
}

也许有办法以不同的方式做到这一点?

函数hideButtons由其他函数调用(来自类MainClass)。

编辑:好吧,我在代码中遇到了一些错误,所以我现在知道它为什么不起作用,但现在每次我尝试使用以下方法清除场景时都会崩溃:

scene->clear()

一样
QList<QGraphicsItem*> allGraphicsItems = scene->items();
for(int i = 0; i < allGraphicsItems.size(); i++)
{
  QGraphicsItem *graphicItem = allGraphicsItems[i];
  scene->removeItem(graphicItem);
  delete graphicItem;
  scene->update();
}
qDebug()<<"End of hideButtons()";

如果我用“delete graphicItem”注释行,它不会崩溃,但是项目不会从场景中删除,因为当我尝试读取它们时,我得到:

QGraphicsProxyWidget::setWidget: cannot embed widget 0×5f547d8; already embedded
QGraphicsProxyWidget::setWidget: cannot embed widget 0×5f6a818; already embedded”

我删除的项目没有父项。 有趣的是,程序在写完“hideButtons()的结尾”后崩溃,因此必须有一些方法(从我的类之外)尝试调用已删除的对象。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,没有删除按钮。我重写了我的程序,所以我只隐藏并显示按钮。它工作正常。

经过一些反思:我认为更好的解决方案是将graphicsView设置为按钮的父级,而不是将该按钮作为小部件添加到场景中。第一种解决方案允许您更简单地更改该按钮。