关于QGraphicsScene 和 QGraphicsView 和 QDialog 的杂乱笔记【或说指针复习。。】

 1 LtCalibrateDlg::~LtCalibrateDlg()
 2 {
 3     if (m_pIplImageGray) cvReleaseImage(&m_pIplImageGray);
 4 
 5     MYDELETE(m_pKeyboard);
 6     MYDELETE(m_pNumKeyboard);
 7 
 8     delete m_pView;         //  LtCalibrateView*    成员变量;
 9     delete m_pScene;        //  QGraphicsScene*     成员变量;
10     delete m_pAboveWnd;
11 
12     delete ui;
13 }
LtCalibrateDlg类中含有LtCalibrateView* 成员变量; QGraphicsScene* 成员变量; IplImage* 成员变量 etc.
 1 LtCalibrateView::~LtCalibrateView()
 2 {
 3     MYDELETE(m_pCircle);
 4     MYDELETE(m_pRing);
 5     MYDELETE(m_pFitCircle);
 6     MYDELETE(m_pLineRect);
 7     MYDELETE(m_pFitLine);
 8     if (m_pIplImageGray) cvReleaseImage(&m_pIplImageGray);
 9     m_pDlg = NULL;          //  LtCalibrateView*    成员变量;
10     m_pScene = NULL;        //  QGraphicsScene*     成员变量;
11 }
LtCalibrateView类中含有LtCalibrateDlg* 成员变量; QGraphicsScene* 成员变量; IplImage* 成员变量 etc.
 1 #define MYDELETE(p) {if (p) { delete p; p = NULL;}} 



在该项目中(Smart2016):
有且只有一个 LtCalibrateDlg 型变量 和 LtCalibrateView 型变量,各自中相应类型的指针成员指向对方,共用同一个 scene ,即 俩者中的 m_pScene 指向同一份内存。(注意 view 和 dlg 中的 IplImage* 指向俩份不同内存
而 item 变量在 view 类中分配内存。故释放空间时(以 LtCalibrateDlg 窗口关闭为触发时机),先删除 view ,在其析构中回收 Item 内存,而只将 dlg 指针 和 scene 指针 置为 NULL(未 delete, 真正的 delete 操作在dlg
中)。而由于俩者的 IplImage* 成员指针指向不同内存,故直接删除即可。 
ps: Qt中 delete scene 操作默认会执行 scene.clear(); 在执行相关操作时需注意


 
原文地址:https://www.cnblogs.com/lt47/p/5886540.html