最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Qt QGraphics體系及刷新機制介紹

 更新時間:2020年04月08日 09:22:26   作者:luoyayun361  
這篇文章主要介紹了淺談Qt QGraphics體系及刷新機制介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

Qt的三大體系:QWidget、QGraphics、Quick,其中QGraphics圖形框架算是這三個中比較高級的一種用法了,并且使用起來相比另外兩個體系會更加的復(fù)雜一些,不過它能實現(xiàn)的功能卻非常強大,主要體現(xiàn)在對圖元的管理,它獨特的刷新機制可以在眾多的圖元中都能夠很好的管理,保證整個交互的流暢度。

而這里要描述的就是QGraphics體系的刷新機制以及該體系中相關(guān)元素的使用方式及特點。

QGraphics體系的三大元素

QGraphics體系中最重要的三大元素:QGraphicsView、QGraphicsScene、QGraphicsItem,這三者構(gòu)成了QGraphics體系最基礎(chǔ)的模型框架,也是在使用過程中必不可少的元素。

  • QGraphicsScene :場景。場景用于裝載所有item元素,它是一個無限大的空間,但是我們在使用的時候通常會指定一塊區(qū)域(setSceneRect)用于安放所有的item元素,并且item之間的邏輯,以及消息傳遞都是從場景中進行統(tǒng)一管理,比如我門要捕捉鼠標消息,或者觸控消息,統(tǒng)一在Scene中獲取,然后分發(fā)給需要的item,可以說Scene就是一個大管家;
  • QGraphicsView:視圖。視圖就好比一個窗口,用于展示當(dāng)前Scene中的元素,上面說到,Scene是一個無限大的空間,當(dāng)view移動到Scene某個位置,就能看到該位置上的Item元素。
  • QGraphicsItem:每一個單獨的圖元,QGraphicsItem是一個基類,還有很多子類繼承于它,也就是這一系列的item行程了整個QGraphics體系中的每一個圖元。

看一下這三者的關(guān)系:

再用一個非常形象的類比應(yīng)該就會很明白這三者的關(guān)系了:
Scene就好比天空,無限大,而Item就是天空中的云朵,可以有很多云,而view就好比一扇窗戶,透過窗戶可以看到天空中的云,而一片天空可以通過很多扇窗戶去看。所以一個Scene可以同時對應(yīng)多個View,但是一個View只能對應(yīng)一個Scene。

刷新機制

OK ,有了以上鋪墊,終于可以進入都今天的主題,QGraphics體系中的刷新機制到底是怎樣的呢?

我們都知道,QWidget是以窗口式刷新,每次會渲染整個窗口達到刷新目的,而QGraphics中可以局部刷新,也就是說可以只刷新某一個圖元,而其他的元素保持不動,這是二者在刷新機制上很大的不同,以致于QGraphics在渲染大量圖元的時候也能很流暢。

看以下圖示:

這里的itemA在刷新的時候,ItemB是不會刷新的,這是兩個獨立的Item,但是考慮以下這種情況:

當(dāng)兩個item有交集的時候,這時候如果刷新ItemA,那么ItemB也會相應(yīng)的刷新,同樣,刷新ItemB的時候,ItemA也會觸發(fā)刷新。

并且要注意的是,上面說到的ItemA和ItemB的交集,并不局限于這兩者只是在同一平面上真實的交集,也就是說,即便是二者的ZValue不同, 但是從Z軸俯視的角度看到二者有交集也會觸發(fā)對方相應(yīng)的刷新。還有一種情況,如果兩個Item是父子關(guān)系,也會全部刷新。

所以上面圖示,即便ItemA和ItemB的ZValue不同,還是會觸發(fā)刷新。這是QGraphicsItem默認的行為。

那么,這樣會帶來什么問題呢,如果我們做的是一個實時性非常高的動作,比如在屏幕上畫線,線條要實時刷新,而這時候如果同時觸發(fā)了其他Item的刷新,并且該Item刷新比較耗時,那么就會直接影響我們畫線item的刷新,直觀的感覺就是卡頓,線條折線嚴重,因為刷新界面都是在主線程中執(zhí)行的,耗時操作將會阻塞。

避免重復(fù)刷新

那么該怎么解決這個問題呢?還真有辦法。

我們的目的就是即便是多個Item重疊,那在刷新其中一個的時候不要讓其他Item也跟著刷新,OK,QGraphicsItem中提供了一個枚舉:

enum QGraphicsItem::CacheMode

設(shè)置Item的緩存模式,我們來看一下緩存的類型:

默認就是不做緩存,然后每次都會重新繪制。

QGraphicsItem::ItemCoordinateCache模式, QGraphicsItem會創(chuàng)建一個具有可配置大小/分辨率的屏幕外像素緩沖區(qū),但是渲染質(zhì)量通常會降低,具體取決于緩存的分辨率和項目轉(zhuǎn)換。 第一次重繪項時,它會將自身渲染到緩存中,然后緩存將在每次后續(xù)曝光中重復(fù)使用。

QGraphicsItem::DeviceCoordinateCache模式,此模式適用于可以移動但不旋轉(zhuǎn),縮放或剪切的項目。 如果直接或間接轉(zhuǎn)換項目,將自動重新生成緩存。 與ItemCoordinateCacheMode不同,DeviceCoordinateCache始終以最高質(zhì)量呈現(xiàn)。

可以根據(jù)實際需要選擇使用哪種緩存模式,然后通過調(diào)用函數(shù)setCacheMode來設(shè)置。

函數(shù)原型為:

void QGraphicsItem::setCacheMode(CacheMode mode, const QSize &logicalCacheSize = QSize())

可選的logicalCacheSize參數(shù)僅由ItemCoordinateCache模式使用,并描述緩存緩沖區(qū)的分辨率,如果logicalCacheSize是(100,100),QGraphicsItem將使項目適合圖形內(nèi)存中的100x100像素,而不管項目本身的邏輯大小。

默認情況下,QGraphicsItem使用boundingRect()的大小。對于除ItemCoordinateCache之外的所有其他緩存模式,將忽略logicalCacheSize。
如果項目花費大量時間重繪自身,則緩存可以加快渲染速度。在某些情況下,緩存也會降低渲染速度,特別是當(dāng)項目花費的時間少于重繪時間時,QGraphicsItem會從緩存中重新繪制。

啟用緩存后,項目的paint()函數(shù)通常會繪制到屏幕外的pixmap緩存中,對于任何后續(xù)重繪請求,Graphics View框架將從緩存中重繪。這種方法特別適用于QGLWidget,它將所有緩存存儲為OpenGL紋理。

注意:啟用緩存并不意味著只有在響應(yīng)顯式update()調(diào)用時才會調(diào)用item的paint()函數(shù)。例如,在內(nèi)存壓力下,Qt可能決定丟棄一些緩存信息;在這種情況下,即使沒有update()調(diào)用(也就是說,沒有啟用緩存),也會調(diào)用item的paint()函數(shù)。

那么,既然會繪制到pixmap緩存中,如果數(shù)據(jù)量特別多,導(dǎo)致pixmap緩存不夠怎么辦,這時候就需要通過更改QPixmapCache的緩存限制以獲得最佳性能。

QPixmapCache

QPixmapCache類為pixmaps提供應(yīng)用程序范圍的緩存。
此類是使用QPixmap優(yōu)化繪圖的工具。

QPixmapCache不包含任何成員數(shù)據(jù),只包含訪問全局像素圖緩存的靜態(tài)函數(shù)。它創(chuàng)建了一個內(nèi)部QCache對象來緩存pixmaps。

默認的pixmap緩存空間為10MB,如果我們需要緩存的數(shù)據(jù)量很大,那么就需要修改這個值,通過調(diào)用靜態(tài)函數(shù)setCacheLimit來進行設(shè)置即可。

到此這篇關(guān)于淺談Qt QGraphics體系及刷新機制介紹的文章就介紹到這了,更多相關(guān)Qt QGraphics內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C++實現(xiàn)TCP聊天室功能

    基于C++實現(xiàn)TCP聊天室功能

    這篇文章主要為大家詳細介紹了基于C++實現(xiàn)TCP聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 單元測試代碼覆蓋率解析

    單元測試代碼覆蓋率解析

    單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。動態(tài)分析就是通過觀察軟件運行時的動作,來提供執(zhí)行跟蹤,時間分析,以及測試覆蓋度方面的信息。下面我們來詳細了解下吧
    2019-06-06
  • vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法

    vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法

    這篇文章主要介紹了vs2019 Com組件初探之簡單的COM編寫及實現(xiàn)跨語言調(diào)用的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • C語言關(guān)于文件的操作方法總結(jié)

    C語言關(guān)于文件的操作方法總結(jié)

    在任何程序的開發(fā)中,對于文件的操作都是繞不開的一個知識點,因為總是要用到存儲讀取的功能,今天我們來詳細了解C語言中是怎么操作文件的
    2021-11-11
  • C語言當(dāng)函數(shù)執(zhí)行成功時return1還是0

    C語言當(dāng)函數(shù)執(zhí)行成功時return1還是0

    本文主要介紹了C語言當(dāng)函數(shù)執(zhí)行成功時return1還是0,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • opencv3/C++ 直方圖反向投影實例

    opencv3/C++ 直方圖反向投影實例

    今天小編就為大家分享一篇opencv3/C++ 直方圖反向投影實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言解決字符串中插入和刪除某段字符串問題

    C語言解決字符串中插入和刪除某段字符串問題

    這篇文章主要介紹了C語言解決字符串中插入和刪除某段字符串問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言求逆矩陣案例詳解

    C語言求逆矩陣案例詳解

    這篇文章主要介紹了C語言求逆矩陣案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++學(xué)習(xí)進階之Makefile基礎(chǔ)用法詳解

    C++學(xué)習(xí)進階之Makefile基礎(chǔ)用法詳解

    Makefile 通常指的是一個含有一系列命令(directive)的,通過 Make自動化編譯工具,幫助 C/C++ 程序?qū)崿F(xiàn)自動編譯目標文件的文件,這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)進階之Makefile基礎(chǔ)用法的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • c語言大小端(數(shù)據(jù)在內(nèi)存中的存儲)

    c語言大小端(數(shù)據(jù)在內(nèi)存中的存儲)

    大小端是內(nèi)存存儲字節(jié)的兩種方式,一個是大端存儲,一個是小端存儲,本文主要介紹了c語言大小端,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

泊头市| 宜宾县| 闵行区| 禹城市| 金平| 龙海市| 百色市| 景泰县| 本溪| 临安市| 改则县| 蒲城县| 青浦区| 隆德县| 哈巴河县| 犍为县| 新建县| 道真| 赣榆县| 襄汾县| 长泰县| 峡江县| 凯里市| 宣武区| 长宁县| 贡嘎县| 伊通| 琼结县| 探索| 宁安市| 江山市| 韶关市| 新宁县| 新蔡县| 洪江市| 竹山县| 姜堰市| 桦南县| 临洮县| 防城港市| 梁平县|