Qt 窗口屬性簡介之Qt::WA_DeleteOnClose


一、簡述

今天介紹一個簡單的窗口屬性——Qt::WA_DeleteOnClose

在正常創建窗口后,我們一般會調用close()方法來關閉窗口,這里我們看一下Q助手中關於close()方法的介紹。

bool QWidget::close() 
Closes this widget. Returns true if the widget was closed; otherwise returns false.

First it sends the widget a QCloseEvent. The widget is hidden if it accepts the close event. If it ignores the event, nothing happens. The default implementation of QWidget::closeEvent() accepts the close event.

If the widget has the Qt::WA_DeleteOnClose flag, the widget is also deleted. A close events is delivered to the widget no matter if the widget is visible or not.


調用close()方法后首先它會向widget發送一個關閉事件(QCloseEvent)。如果widget接受了關閉事件(QCloseEvent),窗口將會隱藏(實際上調用hide())。如果widget不接受關閉事件,那么窗口將什么也不做。默認情況下widget會接受關閉事件,我們可以重寫QCloseEvent事件,可以選擇接受或者不接受。

如果widget設置了Qt::WA_DeleteOnClose屬性,widget將會被釋放。不管widget是否可見,關閉事件都會傳遞給widget。即接收到QCloseEvent事件后,除了調用hide()方法將窗口隱藏,同時會調用deleteLater()方法將窗口釋放掉,不會再占用資源。

所以說調用close()並不一定就會將窗口對象銷毀。而只有設置了 Qt::WA_DeleteOnClose屬性才會刪除銷毀。如果這個屬性沒有設置,close()的作用和hide(),setvisible(false)一樣,只會隱藏窗口對象而已,並不會銷毀該對象。


Qt::WA_DeleteOnClose屬性在Qt助手中的解釋

Qt::WA_DeleteOnClose Makes Qt delete this widget when the widget has accepted the close event (see QWidget::closeEvent()).

如果窗口設置了Qt::WA_DeleteOnClose 這個屬性,在窗口接受了關閉事件后,Qt會釋放這個窗口所占用的資源。


this->setAttribute(Qt::WA_DeleteOnClose);
  • 1
  • 1

所以如果我們在程序中通過 new 的方式創建一個窗口,可以給該窗口設置 Qt::WA_DeleteOnClose屬性。這樣在關閉這個窗口時Qt能夠自動回收該窗口所占用的資源,這樣能夠及時回收無效的資源,有用利於節約內存空間。


下面是我做了一個小測試,通過不斷打開窗口,再關閉所有打開的窗口。在任務管理器中對比該應用程序所占用的資源大小。

設置 了Qt::WA_DeleteOnClose屬性

這里寫圖片描述


未設置 Qt::WA_DeleteOnClose屬性

這里寫圖片描述


從上兩幅圖中可以看到,在不停地打開窗口,程序占用內存不斷增加,而在所有窗口關閉的過程中,設置了 Qt::WA_DeleteOnClose屬性的情況下我們發現關閉的窗口所占用的內存資源在不斷回收,全部關閉后恢復到之前的狀態。而沒有設置Qt::WA_DeleteOnClose屬性的情況下我們發現關閉的窗口所占用的內存資源並沒有減少。這就說明,關閉的窗口內存未被回收。

由此看來Qt::WA_DeleteOnClose屬性的重要性了。

 

http://blog.csdn.net/goforwardtostep/article/details/53647146


免責聲明!

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



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