C++ QgraphicsScene類案例詳解
概述
QgraphicsScene類為管理大量的2D圖形item提供了一個(gè)管理界面,做為item的容器,它配合使用QgraphicsView使用來觀察items,例如線,矩形,文本或者自定義的items,
QgraphicsScene提供了方便的函數(shù)來讓你高效的找到items的位置,或者決定在scene上哪個(gè)item可以看到,配合QgraphicsView窗口,你可以讓可見scene,或者縮放場(chǎng)景來可見一部分
例如:
QGraphicsScene scene;
scene.addText("Hello, world!");
QGraphicsView view(&scene);
view.show();
注意:QgraphicsScene場(chǎng)景沒有自己可見的外觀,他只管理items,需要?jiǎng)?chuàng)建一個(gè)QgraphicsView Widget來讓場(chǎng)景可見。
添加items到場(chǎng)景中,首先你要構(gòu)造一個(gè)QGraphicsScene對(duì)象,然后,你有兩個(gè)選擇: 一是通過addItem函數(shù),一是通過調(diào)用方便的函數(shù) addEllipse(), addLine(), addPath(), addPixmap(), addPolygon(), addRect(), or addText(), 將會(huì)返回一個(gè)新添加的item的指針,添加到場(chǎng)景中的item大小和item本地坐標(biāo)系統(tǒng)有關(guān),初始化位置在場(chǎng)景中的(0,0)
當(dāng)場(chǎng)景改變時(shí)候,例如轉(zhuǎn)換item或者刪除item時(shí)候,場(chǎng)景QgrapbhicsScene會(huì)發(fā)射change()信號(hào),刪除item,可以調(diào)用removeItem()
QgrapbhicsScene使用下標(biāo)來高效的管理item的位置,默認(rèn)的使用BSP樹,適用于一個(gè)大型的場(chǎng)景,其中的item都是靜止不變的,可以選擇調(diào)用setItemIndexMethod().來禁用下標(biāo),可是查看itemIndexMethod來獲取更多的信息
場(chǎng)景的邊界可以使用setSceneRect()來設(shè)置,item可以放置在場(chǎng)景中任何位置,場(chǎng)景默認(rèn)的大小是不受限制的,場(chǎng)景的矩形只用來做內(nèi)部的簿記,管理場(chǎng)景中的item下標(biāo),如果場(chǎng)景矩形沒有設(shè)置,QgrapbhicsScene將會(huì)使用所有item圖元的邊界,使用函數(shù)itemsBoundingRect()返回
QgrapbhicsScene一個(gè)巨大的功能是他可以高效的找到items的位置,即便是場(chǎng)景中有上百萬個(gè)item,items()函數(shù)可以在數(shù)微秒內(nèi)找到item的位置,items()有一些重載函數(shù)(省略)
ItemAt()函數(shù)可以根據(jù)提供的位置返回所在位置處的最上層的item
QgrapbhicsScene包含了場(chǎng)景的選擇信息,選擇items,可以使用setSelectionArea(),清除當(dāng)前選擇可以使用clearSelection(),調(diào)用selectedItems()來獲取已經(jīng)選擇的items
事件處理和傳播
QgrapbhicsScene另外一個(gè)責(zé)任是傳播從QgraphicsView來的事件,發(fā)送事件給場(chǎng)景scene,可以繼承QEvent構(gòu)建一個(gè)事件,然后使用QApplication::sendEvent()來傳遞,event()函數(shù)負(fù)責(zé)分發(fā)給各個(gè)獨(dú)立的items,一些普通的事件可以使用方便的事件處理函數(shù),例如keyPressEvent()和mousePressEvent()
鍵盤事件發(fā)送給當(dāng)前選擇的item,設(shè)置選擇的item,可調(diào)用setFocusItem(),將要選擇的item作為參數(shù)傳遞進(jìn)去,或者item自己調(diào)用函數(shù)QgraphicsItem::setFocus(),調(diào)用focusItem()來獲取當(dāng)前的選擇的item,為了窗口的兼容性,場(chǎng)景也獲取它自己的獲取光標(biāo)的信息,默認(rèn)的,場(chǎng)景沒有焦點(diǎn),鍵盤事件也被忽略,如果函數(shù)setFocus()調(diào)用了,或者場(chǎng)景中一個(gè)item圖元獲得了焦點(diǎn),場(chǎng)景也自動(dòng)的獲得了焦點(diǎn),然后場(chǎng)景的hasFocus()函數(shù)返回真,鍵盤事件將會(huì)發(fā)送給選擇的那個(gè)item,當(dāng)場(chǎng)景丟失了focus,但是其中的item獲得了焦點(diǎn),那么這個(gè)場(chǎng)景也將獲得這個(gè)item的焦點(diǎn)信息,如果場(chǎng)景要重新獲取焦點(diǎn),它將會(huì)把上次獲得焦點(diǎn)的item重新獲得item
對(duì)于鼠標(biāo)移動(dòng)效果,QgrapbhicsScene傳遞鼠標(biāo)懸浮事件,如果其中的item設(shè)置了接受QGraphicsItem::acceptHoverEvents()事件(默認(rèn)是忽略該事件的),它將會(huì)收到GraphicsSceneHoverEnter事件,GraphicsSceneHoverMove,GraphicsSceneHoverLeave事件
所有的鼠標(biāo)事件都傳送給當(dāng)前鼠標(biāo)拖動(dòng)的那個(gè)item,當(dāng)然也要item設(shè)置接受鼠標(biāo)事件,看QGraphicsItem::acceptedMouseButtons(),
可以調(diào)用QGraphicsItem * QGraphicsScene::mouseGrabberItem () const來查看當(dāng)前選擇的item,該函數(shù)會(huì)返回選擇的item的指針。
1、QGraphicsScene::setItemIndexMethod ( ItemIndexMethod method )
用來設(shè)置場(chǎng)景中item的下標(biāo)的方法,QGraphicsScene對(duì)場(chǎng)景應(yīng)用一個(gè)index算法,來加速查詢item,例如items()和itemAt(),下標(biāo)對(duì)于靜態(tài)的場(chǎng)景很有用,對(duì)動(dòng)態(tài)的場(chǎng)景,或者場(chǎng)景中有很多動(dòng)畫項(xiàng)目(animated items),使用下標(biāo)來尋找item就不行了
一般情況下,默認(rèn)的下標(biāo)使用BSP樹就能很好的工作,如果你的場(chǎng)景中使用了很多動(dòng)畫,可以禁用下標(biāo)通過調(diào)用setItemIndexMethod(QGraphicsScene::NoIndexNoIndex)
2、QGraphicsScene::setSceneRect(const QRectF & rect)
用來設(shè)置場(chǎng)景的矩形區(qū)域,限定場(chǎng)景的邊界
這個(gè)矩形限定了場(chǎng)景的范圍,它首先使用QGraphicsView來確定試圖的可卷動(dòng)區(qū)域,使用QGraphicsScene來管理item下標(biāo)
如果不設(shè)定矩形區(qū)域,或者設(shè)置一個(gè)空的矩形,QRect QGraphicsScene::FsceneRect() const會(huì)返回最大的邊界,場(chǎng)景中所有的item都會(huì)被創(chuàng)建。
到此這篇關(guān)于C++ QgraphicsScene類案例詳解的文章就介紹到這了,更多相關(guān)C++ QgraphicsScene類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)utf8字符串和gbk字符串互轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)utf8字符串和gbk字符串轉(zhuǎn)換的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
C++類中的常數(shù)據(jù)成員與靜態(tài)數(shù)據(jù)成員之間的區(qū)別
常數(shù)據(jù)成員是指在類中定義的不能修改其值的一些數(shù)據(jù)成員,類似于我們以前學(xué)過的常變量,雖然是變量,也有自己的地址,但是一經(jīng)賦初值,便不能再被修改2013-10-10
詳解C++設(shè)計(jì)模式編程中對(duì)訪問者模式的運(yùn)用
這篇文章主要介紹了C++設(shè)計(jì)模式編程中對(duì)訪問者模式的運(yùn)用,訪問者模式在不破壞類的前提下為類提供增加新的新操作,需要的朋友可以參考下2016-03-03

