QGraphicsScene - 删除项目 - clear()会崩溃

问题描述 投票:0回答:1

我有一个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类)。

EDIT: 好吧,我在代码中犯了一些错误,所以我现在知道为什么它没有工作,但现在每次我尝试使用清除场景时它都会崩溃。

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 "注释一行,它不会崩溃,但项目没有从场景中删除,因为当我试图读取它们时,我得到的是:"我删除的项目,没有父级。"有趣的是,程序在写完 "End hideButtons("后崩溃,所以一定有一些方法(在我的类之外)试图调用。

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

有趣的是,程序在写完 "End of hideButtons() "之后就崩溃了,所以一定有一些方法(来自我的类之外)试图调用被删除的对象。

qgraphicsitem
1个回答
0
投票

我解决了这个问题,通过不删除按钮。我重写了我的程序,所以我只隐藏和显示按钮。而且它工作得很好。

经过反思,我觉得更好的解决办法是在程序中设置一个隐藏按钮,而不是显示按钮。我认为更好的解决方案是将图形视图设置为按钮的父级,而不是将按钮作为一个小部件添加到场景中。第一种解决方案可以让你更简单地对该按钮进行修改。

© www.soinside.com 2019 - 2024. All rights reserved.