Qt 優雅的結束程序


說明:項目要求設計系統退出按鍵,參照的各大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(); }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM