青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zhonghua

C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
  72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks
Qt中使用圖片資源的方法有很多種,以前我一直分不清各種之間的區(qū)別和Qt相應(yīng)的處理機(jī)制,后來(lái)遇到一些實(shí)際的問(wèn)題,然后再加上查閱源碼和資料,總算弄明白一些事情,但是本文僅僅是個(gè)人理解,如有錯(cuò)誤之處請(qǐng)告訴我,大家一起進(jìn)步。

 

     圖片是一種資源,而在Qt中,對(duì)于資源的使用是有其獨(dú)特的方式的!

     ①:一般來(lái)說(shuō):資源在內(nèi)存中是用資源對(duì)象樹(shù)來(lái)表示的,該樹(shù)在程序啟動(dòng)時(shí)創(chuàng)建。

     ②:而對(duì)于資源而言:我們都是需要先將其加入到這棵樹(shù)中才能加載到內(nèi)存中并被程序使用!!

     ③:而將一個(gè)圖片資源放到程序的資源對(duì)象樹(shù)中是用函數(shù)QResource::registerResource()來(lái)實(shí)現(xiàn)的。亦即:要將資源向這顆資源對(duì)象樹(shù)進(jìn)行注冊(cè),這樣才對(duì)在系統(tǒng)中new創(chuàng)建這個(gè)資“葉子”。

        對(duì)于這一點(diǎn)我們可以直接查看該函數(shù)的源碼:

 

        bool
       QResource::registerResource(const QString &rccFilename, const QString &resourceRoot)
       {
            QString r = qt_resource_fixResourceRoot(resourceRoot);
            if(!r.isEmpty() && r[0] != QLatin1Char('/'))

            {
                 qWarning("QDir::registerResource: Registering a resource [%s] must be rooted in an absolute path (start  with /) [%s]",
                 rccFilename.toLocal8Bit().data(), resourceRoot.toLocal8Bit().data());
                 return false;
            }

            QDynamicFileResourceRoot *root = new QDynamicFileResourceRoot(r);
            if(root->registerSelf(rccFilename))

            {
                 root->ref.ref();
                 QMutexLocker lock(resourceMutex());
                 resourceList()->append(root);
                 return true;
            }
           delete root;
           return false;
    }

   

       由上可見(jiàn):主要就是先創(chuàng)建了一個(gè)資源內(nèi)存對(duì)象,而后將其append到資源對(duì)象樹(shù)上。

 

   ④:當(dāng)我們不再使用某個(gè)圖片資源時(shí):當(dāng)然希望其不再占用內(nèi)存,此時(shí)需要釋放delete它。這時(shí)要用QResource::unregisterResource()函數(shù)來(lái)進(jìn)行反注冊(cè)。此函數(shù)的作用就是在資源對(duì)象樹(shù)中遍歷找到代表該資源的節(jié)點(diǎn),而后delete釋放它。源碼為:

 

    bool
    QResource::unregisterResource(const QString &rccFilename, const QString &resourceRoot)
    {
          QString r = qt_resource_fixResourceRoot(resourceRoot);

          QMutexLocker lock(resourceMutex());
          ResourceList *list = resourceList();
          for(int i = 0; i < list->size(); ++i)

          {
               QResourceRoot *res = list->at(i);
               if(res->type() == QResourceRoot::Resource_File)

               {
                    QDynamicFileResourceRoot *root = reinterpret_cast<QDynamicFileResourceRoot*>(res);
                     if(root->mappingFile() == rccFilename && root->mappingRoot() == r)

                     {
                         resourceList()->removeAt(i);
                          if(!root->ref.deref())

                          {
                              delete root;
                              return true;
                          }
                          return false;
                    }
               }
           }
           return false;
   }

 

 

    總起來(lái)說(shuō)就是:一個(gè)程序所用的所有資源都是放到一顆資源對(duì)象樹(shù)中的,當(dāng)程序啟動(dòng)時(shí)該樹(shù)便會(huì)自動(dòng)創(chuàng)建,而當(dāng)我們使用某個(gè)資源時(shí):都需要實(shí)現(xiàn)將其向該樹(shù)進(jìn)行注冊(cè),當(dāng)不需要時(shí)則需要進(jìn)行反注冊(cè)。

 

 

    ========================================================================

 

     下邊說(shuō)一下我常用的使用圖片資源的方式,主要有三種:

 

      1:使用qrc資源文件來(lái)加載。

      對(duì)于這種方式:其是將所有的圖片資源都轉(zhuǎn)化成二進(jìn)制數(shù)據(jù),存放在一個(gè)靜態(tài)數(shù)組中,而后放到應(yīng)用程序中。所以:當(dāng)程序執(zhí)行時(shí):所有圖片都會(huì)一直在內(nèi)存中,這楊雖然讀取速度很快,但是很占用內(nèi)存空間,對(duì)于一些內(nèi)存有限的設(shè)備不是很適合。

 

      系統(tǒng)轉(zhuǎn)換的主要步驟為:

      ①:當(dāng)編譯時(shí),其會(huì)將我們寫(xiě)的 name.qrc文件轉(zhuǎn)換生成一個(gè)qrc_name.cpp的資源文件,我們可以自己看下這個(gè)生成的cpp文件,發(fā)現(xiàn)其中就是主要有三個(gè)static const數(shù)組。

              qt_resource_data[]

              qt_resource_name[]

              qt_resource_struct[]

 

     這其中qt_resource_data[]中存放的就是圖片的二進(jìn)制數(shù)據(jù)。而后邊的兩個(gè)數(shù)組我們猜測(cè)是做了一個(gè)圖片名字到上邊數(shù)據(jù)的映射,方便系統(tǒng)找到data中的二進(jìn)制數(shù)據(jù)。

 

       至于內(nèi)部作用機(jī)制,有的資料上說(shuō)是:當(dāng)使用qrc資源文件時(shí):系統(tǒng)會(huì)自動(dòng)將所有的圖片資源都向程序的資源對(duì)象樹(shù)進(jìn)行注冊(cè),并且當(dāng)程序結(jié)束運(yùn)行時(shí)再進(jìn)行反注冊(cè)。這也正好解釋了為什么此種方法下圖片資源會(huì)一直占用內(nèi)存的原因。

 

       使用這種方法時(shí):由于圖片資源一直在內(nèi)存中,避免了I/O操作,從而加快了讀取速度。但是卻是以消耗內(nèi)存為代價(jià)的。我做過(guò)一個(gè)project,因?yàn)槠渲杏昧舜罅康膱D片,結(jié)果導(dǎo)致內(nèi)存使用量超乎想象的大,后來(lái)就進(jìn)行了優(yōu)化,也就是用了下邊提到的第二種方法。

 

 

     2:手動(dòng)進(jìn)行注冊(cè)。

       第一種方法相當(dāng)于靜態(tài)加載,但很多情況下我們更希望是動(dòng)態(tài)加載,亦即:用到哪個(gè)資源才將該資源加載進(jìn)來(lái),而不用的則不加載。

 上邊第一種方法之 所以顯示出靜態(tài)加載的特性,這是由于系統(tǒng)一次性自動(dòng)把所有圖片資源都進(jìn)行了注冊(cè),并且在程序運(yùn)行過(guò)程中一直沒(méi)有進(jìn)行反注冊(cè)才導(dǎo)致的。  如果我們可以自行決定:什么時(shí)候?qū)δ且徊糠謭D片資源進(jìn)行注冊(cè)?什么時(shí)候?qū)δ囊徊糠謭D片資源進(jìn)行反注冊(cè)。則顯然我們可以手動(dòng)控制整個(gè)資源在內(nèi)存中的生存周 期!!

    

       這種方法的主要步驟為:

       ①:生成外部二進(jìn)制資源文件。

       ②:在需要時(shí)將該資源向程序的資源對(duì)象樹(shù)進(jìn)行注冊(cè)并使用。

       ③:在不需要時(shí)進(jìn)行反注冊(cè)。

      步驟①主要是用了Qt自帶的一個(gè)工具:rcc.exe  (處于bin文件夾中)。這是Qt的一個(gè)資源編譯器,其編譯對(duì)象是qrc文件,而生成rcc二進(jìn)制資源文件。

      那我們可以用它來(lái)執(zhí)行命令 rcc -binary name.qrc -o name.rcc  來(lái)把qrc資源文件轉(zhuǎn)成rcc二進(jìn)制資源文件。

      而后在程序內(nèi)部:當(dāng)需要使用某一圖片資源時(shí):則直接調(diào)用

     QResource::registerResource(“name.rcc”)進(jìn)行注冊(cè)創(chuàng)建分配內(nèi)存即可!  而不使用時(shí)候則調(diào)用反注冊(cè)函數(shù)!!

 

     --》為了進(jìn)行驗(yàn)證,我曾經(jīng)測(cè)試了一個(gè)例子,主要思路就是:在一個(gè)工程中寫(xiě)了一個(gè)包含若干幅圖片的qrc資源文件,將其轉(zhuǎn)化成rcc二進(jìn)制資源文件。   我在程序界面上擺放兩個(gè)按鈕button,  其中一個(gè)button的click事件響應(yīng)槽負(fù)責(zé)調(diào)用QResource::registerResource()將這個(gè)二進(jìn)制資源文件注冊(cè), 而另外一個(gè)button進(jìn)行反注冊(cè)。  然后跑一下這個(gè)程序,查看下其所占用的內(nèi)存大小:

      

剛啟動(dòng)時(shí):程序所占內(nèi)存顯示為:8940K

   

 

 

 

  而后按下第一個(gè)button進(jìn)行注冊(cè),此時(shí)占用內(nèi)存為:9276K

 

  最后點(diǎn)一下另外一個(gè)button,進(jìn)行反注冊(cè)后,其占用內(nèi)存大小為:8948K

 

      

 

      由上測(cè)試可見(jiàn):注冊(cè)后才會(huì)讓資源占用內(nèi)存!!反注冊(cè)后其會(huì)從內(nèi)存中delete掉!!

 

     所以:這種方式算是動(dòng)態(tài)加載,會(huì)少占用內(nèi)存。但是如果圖片過(guò)多的話,什么時(shí)候需要加載,什么時(shí)候需要去掉,這些邏輯就需要十分注意了。

 

 

    3:直接I/O讀取。

     比如:  ptr->setStyleSheet("./bmp/name.png");

     這種方式我不怎么用,感覺(jué)I/O操作速度慢吧,所以一直沒(méi)去深究。道理上邊都有。

posted on 2012-03-29 15:44 米米 閱讀(1270) 評(píng)論(0)  編輯 收藏 引用 所屬分類: qt
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久成人精品| 国产一区二区久久久| 亚洲国产高潮在线观看| 亚洲伦伦在线| 老司机精品视频一区二区三区| 亚洲三级免费| 蜜臀99久久精品久久久久久软件| 久久黄色小说| 欧美一区二区免费观在线| 国产亚洲人成网站在线观看| 国产精品一二一区| 国产欧美精品xxxx另类| 国产网站欧美日韩免费精品在线观看 | 你懂的网址国产 欧美| 欧美99在线视频观看| 久久婷婷亚洲| 女人香蕉久久**毛片精品| 欧美jizzhd精品欧美巨大免费| 久久久久国色av免费观看性色| 欧美国产免费| 亚洲影音先锋| 久久精品视频免费观看| 欧美精品日韩一区| 欧美精品免费视频| 国产亚洲精品久久久久久| 激情综合视频| 日韩西西人体444www| 亚洲欧美制服另类日韩| 欧美一区二区高清| 麻豆精品国产91久久久久久| 欧美99久久| 美女视频黄 久久| 女女同性精品视频| 男人的天堂亚洲在线| 最新高清无码专区| 亚洲免费观看高清完整版在线观看熊 | 国产日韩欧美制服另类| 亚洲青涩在线| 中文有码久久| 六月婷婷久久| 最新亚洲激情| 午夜影视日本亚洲欧洲精品| 久久综合亚州| 欧美视频1区| 在线观看欧美成人| 亚洲欧美日韩成人| 欧美黄色免费网站| 91久久亚洲| 久久福利视频导航| 欧美人与禽猛交乱配| 国产精品久久久久一区二区三区共 | 免费成人av在线| 狠狠综合久久av一区二区老牛| 亚洲欧洲在线观看| 亚洲毛片av在线| 欧美mv日韩mv国产网站| 一本久道久久久| 欧美日本网站| 亚洲高清在线| 一本久道久久综合中文字幕| 模特精品裸拍一区| 亚洲午夜电影网| 欧美色视频日本高清在线观看| 狠狠色2019综合网| 久久久久高清| 亚洲欧美亚洲| 国产视频一区在线观看| 亚洲一区二区高清视频| 欧美一区二区在线视频| 国产精品99久久久久久白浆小说| 免费不卡中文字幕视频| 亚洲高清激情| 国产欧美91| 欧美四级伦理在线| 日韩午夜中文字幕| 久久亚洲国产精品一区二区| 亚洲网站在线| 国产伦精品一区二区三区四区免费| 日韩亚洲精品电影| 日韩小视频在线观看专区| 久久久美女艺术照精彩视频福利播放| 国产精品人人做人人爽人人添| 欧美一区二区三区日韩| 亚洲综合国产精品| 亚洲黄一区二区三区| 欧美日韩高清免费| 亚洲美女在线观看| 一区二区三区欧美激情| 欧美精品二区| 性欧美精品高清| 午夜视频一区二区| 国产在线精品二区| 免费短视频成人日韩| 最新日韩在线视频| 欧美日韩国产综合网| 亚洲视频在线一区| 久久国产视频网站| 在线看国产日韩| 亚洲免费观看高清完整版在线观看| 毛片一区二区| 亚洲电影天堂av| 亚洲最新在线视频| 国产美女精品免费电影| 欧美成人一区二区三区片免费| 久热精品在线视频| 欧美伊久线香蕉线新在线| 久久精品最新地址| 国产亚洲欧美一区在线观看| 亚洲激情欧美| 国产精品日本精品| 亚洲国产岛国毛片在线| 国产精品美女主播| 亚洲二区视频在线| 国产精品xvideos88| 欧美电影在线免费观看网站| 欧美日韩在线三级| 久久久女女女女999久久| 欧美日韩国产123| 欧美综合国产| 国产精品久久久久永久免费观看| 久久久噜噜噜久久人人看| 欧美日韩高清在线| 免费观看30秒视频久久| 国产精品久久久久秋霞鲁丝 | 99国内精品久久| 99国产精品久久久久久久成人热| 国产亚洲一级高清| 日韩午夜精品| 亚洲毛片播放| 久久久亚洲精品一区二区三区 | 欧美日本二区| 免费中文日韩| 欧美视频在线观看一区| 亚洲人成在线观看一区二区 | 欧美精品性视频| 亚洲影视九九影院在线观看| 亚洲欧美激情诱惑| 国产欧美日韩一区二区三区在线| 91久久线看在观草草青青| 国产欧美日韩视频一区二区| 亚洲一区二区高清视频| 亚洲精品日韩在线观看| 久久精品人人| 欧美中文在线免费| 国产精自产拍久久久久久| 亚洲精品社区| 1769国产精品| 女人天堂亚洲aⅴ在线观看| 久久免费一区| 精品51国产黑色丝袜高跟鞋| 午夜精品亚洲一区二区三区嫩草| 亚洲第一色在线| 久久久之久亚州精品露出| 久久久久久久久综合| 国内精品久久久| 午夜精品久久久久久久| 久久免费视频在线观看| 国产在线精品一区二区夜色| 亚洲乱亚洲高清| 亚洲欧美日韩成人高清在线一区| 欧美福利视频网站| 99成人免费视频| 日韩视频永久免费| 欧美日韩国产区| 一区二区三区免费在线观看| 久久午夜影视| 亚洲国产视频直播| 欧美三日本三级三级在线播放| 亚洲麻豆av| 久久精品亚洲| 136国产福利精品导航| 亚洲免费中文| 欧美第一黄网免费网站| 国产中文一区二区三区| 欧美成人精品h版在线观看| 日韩午夜av电影| 久久激情五月激情| 欧美片第1页综合| 亚洲影视九九影院在线观看| 久久久久国色av免费观看性色| 亚洲国产美女精品久久久久∴| 欧美激情国产日韩精品一区18| 亚洲视频国产视频| 久久青青草综合| 国产精品扒开腿爽爽爽视频| 久久久国产精品亚洲一区| 亚洲福利视频专区| 亚洲在线播放| 另类人畜视频在线| 亚洲视频在线播放| 久久精品国产亚洲a| 国产婷婷精品| 欧美日韩伦理在线| 亚洲欧美日韩国产另类专区| 亚洲国产老妈| 一色屋精品视频免费看| 亚洲人成欧美中文字幕| 久久久久国产精品厨房| 亚洲精品一二三| 最新国产精品拍自在线播放|