• 3662阅读
  • 1回复

(求助)关于QWidget *是否调用 delete进行析构。 [复制链接]

上一主题 下一主题
离线家有布衣
 

只看楼主 倒序阅读 楼主  发表于: 2016-11-08
在成员函数中用到QWidget *w =new QWidget;
QListWidget中运用,setItemWidget(item,w);
我把w进行析构出现段错误,做了判断,但是其值并不是NULL。
问题:是是不是不用析构?
下面是qt源码,里面有setParent.
  1. void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
  2. {
  3.     Q_D(QListWidget);
  4.     QModelIndex index = d->listModel()->index(item);
  5.     QAbstractItemView::setIndexWidget(index, widget);
  6. }

  1. void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)
  2. {
  3.     Q_D(QAbstractItemView);
  4.     if (!d->isIndexValid(index))
  5.         return;
  6.     if (QWidget *oldWidget = indexWidget(index)) {
  7.         d->persistent.remove(oldWidget);
  8.         d->removeEditor(oldWidget);
  9.         oldWidget->deleteLater();
  10.     }
  11.     if (widget) {
  12.         widget->setParent(viewport());
  13.         d->persistent.insert(widget);
  14.         d->addEditor(index, widget, true);
  15.         widget->show();
  16.         dataChanged(index, index); // update the geometry
  17.         if (!d->delayedPendingLayout)
  18.             widget->setGeometry(visualRect(index));
  19.     }
  20. }

离线clickto

只看该作者 1楼 发表于: 2016-11-22
如果你的QWidget *没有父控件,那需要手动delete,如果有父控件,那不需要手动delete,因为在父控件进行析构的时候会delete所有子控件,如果你提前进行了delete,而子控件又没有赋值为NULL因而成为野指针的话,那么当父控件进行析构的时候。。。
快速回复
限100 字节
 
上一个 下一个