qt c++ mdiarea控件中的子窗口qwidget关闭时 自定义树模型 parent()程序报错
时间: 2023-12-03 14:47:06 浏览: 83
根据你的问题描述,我猜测你在自定义树模型中实现了 `parent()` 函数,并且在子窗口 `QWidget` 关闭时,调用了该函数导致程序报错。
可能的原因是:当一个子窗口关闭时,它的 `QWidget` 对象会被删除,但是树模型中关于该子窗口的节点信息并没有被及时更新,因此在调用 `parent()` 函数时会访问到已经被删除的对象,从而导致程序出错。
解决方法是在子窗口被关闭时,及时更新树模型中的节点信息。你可以在子窗口的关闭事件中发送一个信号,让树模型接收到该信号,并在相应的槽函数中更新节点信息。
示例代码如下:
```
// 子窗口关闭事件
void MyWidget::closeEvent(QCloseEvent *event)
{
emit widgetClosed(this); // 发送关闭信号
QWidget::closeEvent(event);
}
// 树模型中的槽函数
void MyTreeModel::onWidgetClosed(QWidget *widget)
{
// 查找该子窗口对应的节点信息,并从父节点中移除
QModelIndex parentIndex = findIndexForWidget(widget->parentWidget());
if (parentIndex.isValid()) {
int row = findRowForWidget(widget);
beginRemoveRows(parentIndex, row, row);
removeWidgetFromMap(widget);
endRemoveRows();
}
}
```
其中,`findIndexForWidget()` 和 `findRowForWidget()` 函数分别用于查找节点对应的索引和行号,`removeWidgetFromMap()` 函数用于从节点信息映射中移除该子窗口的信息。
阅读全文