欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ QgraphicsScene類案例詳解

 更新時間:2021年08月23日 14:59:18   作者:changbaolong  
這篇文章主要介紹了C++ QgraphicsScene類案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

概述

QgraphicsScene類為管理大量的2D圖形item提供了一個管理界面,做為item的容器,它配合使用QgraphicsView使用來觀察items,例如線,矩形,文本或者自定義的items,

QgraphicsScene提供了方便的函數(shù)來讓你高效的找到items的位置,或者決定在scene上哪個item可以看到,配合QgraphicsView窗口,你可以讓可見scene,或者縮放場景來可見一部分

例如:

QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();

注意:QgraphicsScene場景沒有自己可見的外觀,他只管理items,需要創(chuàng)建一個QgraphicsView Widget來讓場景可見。

添加items到場景中,首先你要構(gòu)造一個QGraphicsScene對象,然后,你有兩個選擇: 一是通過addItem函數(shù),一是通過調(diào)用方便的函數(shù) addEllipse(), addLine(), addPath(), addPixmap(), addPolygon(), addRect(), or addText(),   將會返回一個新添加的item的指針,添加到場景中的item大小和item本地坐標系統(tǒng)有關(guān),初始化位置在場景中的(0,0)

當場景改變時候,例如轉(zhuǎn)換item或者刪除item時候,場景QgrapbhicsScene會發(fā)射change()信號,刪除item,可以調(diào)用removeItem()

QgrapbhicsScene使用下標來高效的管理item的位置,默認的使用BSP樹,適用于一個大型的場景,其中的item都是靜止不變的,可以選擇調(diào)用setItemIndexMethod().來禁用下標,可是查看itemIndexMethod來獲取更多的信息

場景的邊界可以使用setSceneRect()來設(shè)置,item可以放置在場景中任何位置,場景默認的大小是不受限制的,場景的矩形只用來做內(nèi)部的簿記,管理場景中的item下標,如果場景矩形沒有設(shè)置,QgrapbhicsScene將會使用所有item圖元的邊界,使用函數(shù)itemsBoundingRect()返回

QgrapbhicsScene一個巨大的功能是他可以高效的找到items的位置,即便是場景中有上百萬個item,items()函數(shù)可以在數(shù)微秒內(nèi)找到item的位置,items()有一些重載函數(shù)(省略)

ItemAt()函數(shù)可以根據(jù)提供的位置返回所在位置處的最上層的item

QgrapbhicsScene包含了場景的選擇信息,選擇items,可以使用setSelectionArea(),清除當前選擇可以使用clearSelection(),調(diào)用selectedItems()來獲取已經(jīng)選擇的items

事件處理和傳播

QgrapbhicsScene另外一個責任是傳播從QgraphicsView來的事件,發(fā)送事件給場景scene,可以繼承QEvent構(gòu)建一個事件,然后使用QApplication::sendEvent()來傳遞,event()函數(shù)負責分發(fā)給各個獨立的items,一些普通的事件可以使用方便的事件處理函數(shù),例如keyPressEvent()和mousePressEvent()

鍵盤事件發(fā)送給當前選擇的item,設(shè)置選擇的item,可調(diào)用setFocusItem(),將要選擇的item作為參數(shù)傳遞進去,或者item自己調(diào)用函數(shù)QgraphicsItem::setFocus(),調(diào)用focusItem()來獲取當前的選擇的item,為了窗口的兼容性,場景也獲取它自己的獲取光標的信息,默認的,場景沒有焦點,鍵盤事件也被忽略,如果函數(shù)setFocus()調(diào)用了,或者場景中一個item圖元獲得了焦點,場景也自動的獲得了焦點,然后場景的hasFocus()函數(shù)返回真,鍵盤事件將會發(fā)送給選擇的那個item,當場景丟失了focus,但是其中的item獲得了焦點,那么這個場景也將獲得這個item的焦點信息,如果場景要重新獲取焦點,它將會把上次獲得焦點的item重新獲得item

對于鼠標移動效果,QgrapbhicsScene傳遞鼠標懸浮事件,如果其中的item設(shè)置了接受QGraphicsItem::acceptHoverEvents()事件(默認是忽略該事件的),它將會收到GraphicsSceneHoverEnter事件,GraphicsSceneHoverMove,GraphicsSceneHoverLeave事件

所有的鼠標事件都傳送給當前鼠標拖動的那個item,當然也要item設(shè)置接受鼠標事件,看QGraphicsItem::acceptedMouseButtons(),

可以調(diào)用QGraphicsItem * QGraphicsScene::mouseGrabberItem () const來查看當前選擇的item,該函數(shù)會返回選擇的item的指針。

1、QGraphicsScene::setItemIndexMethod ( ItemIndexMethod method )

用來設(shè)置場景中item的下標的方法,QGraphicsScene對場景應(yīng)用一個index算法,來加速查詢item,例如items()和itemAt(),下標對于靜態(tài)的場景很有用,對動態(tài)的場景,或者場景中有很多動畫項目(animated items),使用下標來尋找item就不行了

一般情況下,默認的下標使用BSP樹就能很好的工作,如果你的場景中使用了很多動畫,可以禁用下標通過調(diào)用setItemIndexMethod(QGraphicsScene::NoIndexNoIndex)

2、QGraphicsScene::setSceneRect(const QRectF & rect)

用來設(shè)置場景的矩形區(qū)域,限定場景的邊界

這個矩形限定了場景的范圍,它首先使用QGraphicsView來確定試圖的可卷動區(qū)域,使用QGraphicsScene來管理item下標

如果不設(shè)定矩形區(qū)域,或者設(shè)置一個空的矩形,QRect QGraphicsScene::FsceneRect() const會返回最大的邊界,場景中所有的item都會被創(chuàng)建。

到此這篇關(guān)于C++ QgraphicsScene類案例詳解的文章就介紹到這了,更多相關(guān)C++ QgraphicsScene類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論