使用自定义上下文菜单删除QTreeView项时崩溃

时间:2019-09-04 13:40:24

标签: c++ qt

我有带有自定义模型和项目的QTreeView。每个项目都可以通过右键单击触发上下文菜单。我的问题是,当我尝试使用上下文菜单删除项目后刷新视图时,应用程序崩溃,因为它遇到了分段错误。上下文菜单由exec()在其他线程中运行,因此它不知道何时删除该项目(及其上下文菜单QMenu)并崩溃。

void ProjectExplorerDock::onCustomContextMenu(const QPoint& point)
{
  QModelIndex index = this->pProjectExplorerView->indexAt(point);
  auto item = static_cast<TreeItem*>(index.internalPointer());
  if(item)
  {
    if(item->getMenu())
    {
      item->getMenu()->exec(this->pProjectExplorerView->viewport()->mapToGlobal(point));
    }
  }
}

触发的动作会发出删除该项目的信号。我试图在exec()之后执行此操作:

void ProjectExplorerDock::onCustomContextMenu(const QPoint& point)
{
  QModelIndex index = this->pProjectExplorerView->indexAt(point);
  auto item = static_cast<TreeItem*>(index.internalPointer());
  if(item)
  {
    if(item->getMenu())
    {
      item->getMenu()->exec(this->pProjectExplorerView->viewport()->mapToGlobal(point));
      emit refreshProject();
    }
  }
}

但是要区分是否需要刷新需要做更多的工作。

删除QMenu时是否有停止exec()的方法?

示例函数显示如何完成。每当我要刷新视图时都会调用它。每个TreeItem都有QMenu。

void ProjectExplorerDock::fillModel(Project& project)
{
  delete pTreeModel;
  pTreeModel = new TreeModel(mHeaders);
  if(!project.getName().empty())
  {
    QList<QVariant> projectName {QString::fromStdString(project.getName()), ""};
    TreeItem* projectNameItem = new TreeItem(projectName);
pTreeModel->addNewTreeItem(projectNameItem, pTreeModel->getRootItem());
pProjectExplorerView->setModel(pTreeModel);
void TreeModel::addNewTreeItem(TreeItem* item, TreeItem* parentItem)
{
  beginInsertRows(QModelIndex(), rowCount(), rowCount());
  item->setParent(parentItem);
  parentItem->appendChild(item);
  endInsertRows();
}

1 个答案:

答案 0 :(得分:0)

好的,我找到了答案。 删除QMenu之前,请确保调用QMenu::hide()以停止使用它。