QT下資源使用和資源占用…(可以動態加載資源文件,這樣不占內存)


    最近研究了一下如何從外部動態調用圖片的問題,從而研究了圖片資源的使用方法。網上最常見的帖子是這個,感覺總結的還不錯。
    總的來說,就兩種方式。
    一種就是使用qrc資源文件,也就是在QT的工程中添加資源文件,這個方法比較簡單容易操作,對於初學者來說比較容易上手,在資源比較少的時候可以使用。但是也有它的缺點,就是添加的資源文件(如qrc.cpp)會直接被存放到靜態數組中,從而一直占用內存,使內存的利用率不高。有的時候如果資源過大,可能編譯都無法通過,會造成out of memory的錯誤。
    這個時候,就需要第二種方法,就是通過從外部引用資源二進制文件(一般為rcc文件)。具體的使用方法見上面的帖子,寫的很詳細。
    這里主要說一下感覺寫的不詳細的地方。
    本帖主要針對windows下的QT平台。
    首先要想生成資源二進制文件,先要在QT的工程中添加資源文件(.qrc格式,不會添加的先學如何使用qrc吧),將所有的圖片資源添加成功之后,保存工程,在.qrc格式的文件下右鍵,選擇在此處打開命令台(也就是常用的dos格式),打開之后輸入命令 rcc -binary name.qrc -o name.rcc  來把qrc資源文件轉成rcc二進制資源文件。生成后的rcc二進制文件位於工程目錄下。那么,接下來就可以進行注冊了。關於QT的注冊管理機制,上面的帖子有介紹。
       如何進行注冊??
       在注冊之前請將工程中你所建立的qrc文件刪除,否則沒有什么意義了,qrc就是用來生成rcc文件的。
       首先,將生成的RCC文件拷貝到你的可執行文件的目錄下,可以是debug,也可以是release.然后調用函數              
     QResource::registerResource("debug/abc.rcc");
     注意,如果沒有debug的話,那么注冊不會成功。為什么前面需要一個debug?
      這里牽扯到一個相對路徑的問題,本人也沒有多做研究。簡單來說,相對路徑是相對於 當前工作目錄 而言的,所以,如果你覺得你不知道當前的工作目錄,那么可以通過qDebug() << QDir::currentPath();從而你可以知道你當前工作目錄下,知道了當前工作目錄,就可以輕松的選擇相對目錄了。
     注冊成功后,你可以通過任務管理器觀看相應的內存占用,會發現內存增加了,就是你所添加的資源文件的大小。
     注冊完成后,就可以按照使用qrc資源的方法來使用了。原來怎么操作,現在也怎么操作。
     如果你不想使用這部分資源了,可以使用反注冊,從而將這部分資源從內存中刪除。
     調用 QResource::unregisterResource("debug/abc.rcc");//這樣,就可以將資源從內存中刪除,可以節省內存。
     
     在這個過程中,發現了一個問題。就是關於setstylesheet的問題。
      ui -> label -> setStyleSheet("QLabel{border-image:url(:/home/image/DSC05363.JPG);}");
        在這里,還要說明一個問題。為什么路徑前面有一個冒號。這個路徑其實也是相對路徑,有冒號說明是qrc資源文件的相對路徑。
       如上所示,注冊了資源之后,按照使用qrc資源的方法可以調用圖片,但是該圖片一經調用進入label中,內存會急劇增大,原來該圖片(使用的格式為jpg格式)為4M,調用進入label后,增加了93M左右的內存,只有將這個label標簽清空之后,內存才會恢復到原來的大小(在windows QT下)。
     原來,QT在對圖片進行操作時,是將外部的圖片按像素寫入的,經過實驗發現,無論是何種格式的圖片,無論大小如何,只要像素點相同,那么在QT將圖片寫入控件之后所占用的內存是一樣的,增加的內存不是圖片自身的大小,而是增加了幾倍,並且與所使用的控件的大小有關,這樣的話必然導致內存占用率增大。
    當你的工程中使用的標簽等控件很多,並且需要大量的外部圖片來覆蓋這些控件,當你頻繁的使用這些控件的時候,會出現內存大量占用,而且是呈現累計趨勢的,最后造成內存溢出的錯誤。這種時候可以使用多進程的方法,可以將不同的界面做成不同的進程,當這個界面操作完成之后,關閉進程,該進程占用的內存清空,只是在進程切換的時候可能速度上有所變慢,但是可以保證占用內存資源少。

http://www.cnblogs.com/swarmbees/p/5621403.html


免責聲明!

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



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