說明:項目要求設計系統退出按鍵,參照的各大APP都有安全結束程序功能。
1、了解Qt內存管理中的堆分配機制
繼承與C++的new、delete與Qt自身的deleteLater()。new與delete應一對一出現,deleteLater()可以代替delete。
deleteLater()的原理是:QObject::deleteLater()並沒有將對象立即銷毀,而是向主消息循環發送了一個event,下一次
主消息循環收到這個event之后才會銷毀對象。 這樣做的好處是可以在這些延遲刪除的時間內完成一些操作,壞處就
是內存釋放會不及時。
2、了解Qt對象析構機制
Qt使用家族樹的形式管理對象。當指定了“父窗口”之后,該窗口的析構就由父窗口來接管,Qt會保證在合適的時
候析構該窗口,並且只析構一次。
3、匹配析構
1、在沒有指定父對象的前提下,需要手動析構,或者setAttribute(Qt::WA_DeleteOnClose,true);(如果此
屬性為true,則當最后一個可見的主窗口(即沒有父窗口的窗口)關閉時,應用程序將退出。)
2、在指定了父對象之后,除非你想提前關閉,不然不需要任何操作,子窗口會跟隨父窗口銷毀。
注意:兩種方法都需要寫好析構函數,析構那些沒有關系樹的new對象。
4、舉例
例子1:
//構造函數 Mainwindow::Mainwindow(QWidget *parent): QWidget(parent), pbridge(new CBridge) { ui_voyage = new Voyage(); ui_navigator = new Navigator(); ui_setup = new SetUp(); ui_group = new Group(); ui_playback = new PlayBack(); ui_keyboard = new KeyBoard(); mainwindowtips = new MessageTips(); calib20mintimer = new QTimer(this); #if DEBUG_FLAGE ui_debug = new Debug(); #endif }
//析構函數 Mainwindow::~Mainwindow() { if( pbridge != NULL ){pbridge->deleteLater();} if( ui_navigator != NULL ){ui_navigator->close();} if( ui_group != NULL ){ui_group->close();} if( ui_playback != NULL ){ui_playback->close();} if( ui_keyboard != NULL ){ui_keyboard->close();} if( ui_setup != NULL ){ui_setup->close();} #if DEBUG_FLAGE if( ui_debug != NULL ){delete ui_debug;ui_debug = NULL;} #endif if( mainwindowtips != NULL ){mainwindowtips->close();} }
說明:其中calib20mintimer為QTimer類,父對象為MainWindow,故不需要手動析構
例子2:
//構造函數 CBridge::CBridge(QObject *parent) : QObject(parent) { keyBusiness = new Business_Key(); logBusiness = new Business_Log(this); waterdepthBusiness = new Business_WaterDepth(this); underwaterBusiness = new Business_UnderWater(this); insBusiness = new Business_Ins(this); batteryBusiness = new Business_Battery(this); dataStorage = new DataStorage(this); waterdepthSerial = new Serial_WaterDepth(this); underwaterSerial = new Serial_UnderWater(this); insSerial = new Serial_Ins(this); }
//析構函數 CBridge::~CBridge() { if( keyBusiness!=NULL ){ keyBusiness->deleteLater(); } }
