我有带有自定义模型和项目的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();
}
答案 0 :(得分:0)
好的,我找到了答案。
删除QMenu之前,请确保调用QMenu::hide()
以停止使用它。