Qt 使用关联菜单从布局中删除自身

Qt 使用关联菜单从布局中删除自身,qt,Qt,我正在使用FlowLayout的示例 我为FlowLayout中的所有项目添加了上下文菜单,以启用重命名和删除。重命名可以工作,但每当我调用Remove时,都会收到一个分段错误 以下是removeSlot调用: QAction *removeAction = new QAction(tr("Remove"), this); connect(removeAction, SIGNAL(triggered()), this, SLOT(removeSlot())); Menu->ad

我正在使用FlowLayout的示例

我为FlowLayout中的所有项目添加了上下文菜单,以启用重命名和删除。重命名可以工作,但每当我调用Remove时,都会收到一个分段错误

以下是
removeSlot
调用:

  QAction *removeAction = new QAction(tr("Remove"), this);
  connect(removeAction, SIGNAL(triggered()), this, SLOT(removeSlot()));
  Menu->addAction(removeAction);
和发射信号:

void FlowLayoutWidget::removeSlot()
{
  emit removeMe(m_ownId);
}
FlowWindow.cpp捕获信号并执行以下代码:

void FlowWindow::removeItemAt(int _index)
{

  while(QLayoutItem* item = flowLayout->itemAt(_index))
  {
      QWidget* widget = item->widget();
      flowLayout->removeWidget(widget);
      delete widget;
      break;

  }
}

每当调用此函数时,我都会收到一个分段错误。如何解决此问题?

您正在从对象触发的插槽中调用对象的
delete
。这有时可能是有问题的,其方式并不总是显而易见的。我怀疑这可能是你在这个案子中遇到的问题。Qt提供了方法
QObject::deleteLater()
,该方法通过在控件返回事件循环后安排对象删除来处理此问题

void FlowWindow::removeItemAt(int _index)
{

  while(QLayoutItem* item = flowLayout->itemAt(_index))
  {
      QWidget* widget = item->widget();
      flowLayout->removeWidget(widget);
      //delete widget; avoid this
      widget.deleteLater(); //try this instead
      break;

  }
}
有关更多信息,请参阅


另外,我会注意到,由于您正在删除(或计划删除)对象,因此不需要显式调用
flowLayout->removeWidget(widget)
-当对象被销毁时,它将自动得到处理。

谢谢:)。解决了分割误差问题。您还可以告诉我如何使用
itemAt
获取索引以正确删除该项目吗?我可以迭代流布局吗?这是一个不同的主题,所以它应该是它自己的问题。当你问这个问题时,一定要展示你的尝试和发现。(这可能会自行解决问题。)行动。这是因为索引没有更新。现在一切都清楚了。