qtgraphicsview框架中實(shí)現(xiàn)多個item之間的層次調(diào)整功能_第1頁
qtgraphicsview框架中實(shí)現(xiàn)多個item之間的層次調(diào)整功能_第2頁
qtgraphicsview框架中實(shí)現(xiàn)多個item之間的層次調(diào)整功能_第3頁
qtgraphicsview框架中實(shí)現(xiàn)多個item之間的層次調(diào)整功能_第4頁
qtgraphicsview框架中實(shí)現(xiàn)多個item之間的層次調(diào)整功能_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Qt GraphicsView框架中實(shí)現(xiàn)多個item之間的層次調(diào)整功能目的:要實(shí)現(xiàn) GraphicsView 中多個item 之間的層次調(diào) 整功能,即:選中的item可以實(shí)現(xiàn)移動至頂層、移動至底 層、上移一層、下移一層”等功能。之前盲目地認(rèn)為Qt API會提供“獲取與之相鄰的sibling item ”類似這樣的接口, 但是查詢無果。setZValue()設(shè)置item的棧順序,通過zValue()來測試,具有低 z-values的item比具有高 z-value 的item 先繪制。(即:低 z-values 的item 位于下層, 高z-values 的item 位于上層)可以調(diào)用 setZ

2、value()來設(shè)置一個item的Z值。默認(rèn)的Z值是0 ,具有同樣的Z 值的item會按照插入的順序來入棧 (stack order)。也就是說, GraphicsView 會優(yōu)先根據(jù)item的Z值決定item的層次,只 有當(dāng)Z值相同的情況下才會去理會stack order ;這樣,我就基本上決定放棄采用 setZvalue()方法來實(shí)現(xiàn)我的功能了,因?yàn)?,由于所有item的Z值默認(rèn)都是0,調(diào)用setZvalue()方 法基本上只能實(shí)現(xiàn)置于頂層或底層的功能,即使想辦法獲取 到了與其相鄰的上一個或下一個item ,也是需要去設(shè)置相關(guān)item的Z值,這樣一來,維護(hù) tiem的層次的工作完全由自 己來

3、完成了,而不再是 GraphicsSene 自己去根據(jù)stackorder去管理維護(hù)了,自己的工作量會很大,而且,效率會 比較低下。于是,果斷放棄此途徑。還是想偷個賴,把item的維護(hù)工作依然交給 Scene ,所以通過調(diào)整item的stack order來實(shí)現(xiàn)上述功能。API有一個stackBefore(QGraphicsItem *sibling) 方法,可以調(diào)用該訪 求來重新排序item的列表,就可以直接調(diào)整item的順序了。 例如:itemA-stackBefore(itemB) ,是將 itemA 的 order 重置到itemB之前,這樣,先繪制itemA,后繪制itemB ,it

4、emB 處于上方。但是,這需要我解決“獲取 sibling item ”的工作, 還好問題不大,QGraphicsScene 類方法 collidingItems(QGraphicsItem *item) 會返回一個在這個 Scene中與傳入的item有碰撞的所有其它item的一個列表 QList,注意一下,這個列表是不包含item本身的,而且以是自上層向下層的順序來返回的。于是,自己寫了一個算法,以獲取當(dāng)前item在所有沖撞items中的位置,如 下所示: cpp:nogutter viewplaincopyintQDrawGraphicsScene二getItemIndex(QGraphi

5、csItem*item) /list1是與item碰撞的其它item列表 QList list1 =collidingItems(item);沒有碰撞if (list1.size() = 0) return 0;/只有一個與之碰撞if (list1.size() = 1)共 2 層(QRectFrect1(item-mapToScene(item-boundingRect().bou ndingRect();QRectFrect2(list1.first()-mapToScene(list1.first()-bounding Rect().boundingRect();QRectF rectM

6、ix = ersected(rect2);QPointFpoint(item-mapFromScene(rectMix).boundingRect().ce nter();QRectF rect(point.x()-0.5, point.y()-0.5, 1, 1);if (item-isObscured(rect)return 1;/item為下層(共2層)elsereturn 0;/item為頂層(共2層)/ist2是與listl末點(diǎn)碰撞的其它item列表QList list2 = collidingItems(list1.last();if (list1.first()

7、 != list2.first()與之碰撞 2 個以上,且 item位于頂層return 0;else/ist3是與list1起點(diǎn)碰撞的其它item列表QList list3 = collidingItems(list1.first();return (list3.indexOf(item) + 1);返回該item的具體位置) 算法中的難點(diǎn)是只有兩層(即list1.size()為1)的時候判斷 哪個item在上,哪個在下,為此費(fèi)盡周折,最終采用碰撞混和區(qū)域是否被覆蓋的方法來實(shí)現(xiàn)判斷兩個item的上下關(guān)系。(完全使用碰撞混和區(qū)域會由問題,是因?yàn)檗D(zhuǎn)換后的區(qū)域并未完全覆蓋,通過查看源碼,覆蓋判斷很

8、嚴(yán)格,所以取了混和 區(qū)域的一個中心小區(qū)域進(jìn)行判斷,呃。 。汗一把ToT)注意: 為了便于表達(dá),此函數(shù)返回的值是該item在與其他碰撞item 共同組成的列表中的位置,即,該 item也是其中之一;而, collidingItems(QGraphicsItem *item)返回的列表是不包含傳入進(jìn)去的item的,了解了這個,下面的調(diào)用才不會由問題。 以下是我簡單寫的一個小demo,以作測試:具體的調(diào)用:cpp:nogutter viewplaincopy/ 上移一層void QDrawGraphicsScene:slotLayerUpper() QList collideItems = coll

9、idingItems(itemSelected);if (collideItems.size() = 0)return;int nCurIndex = getItemIndex(itemSelected);if (nCurIndex = 0)return;collideItems.at(nCurIndex -1)-stackBefore(itemSelected);update();下移一層void QDrawGraphicsScene:slotLayerLower()(QList items = selectedItems();QGraphicsItem *itemSelected = it

10、ems.first();QList collideItems = collidingItems(itemSelected);if (collideItems.size() = 0)return;int nCurIndex = getItemIndex(itemSelected);if (nCurIndex = collideItems.size()return;itemSelected-stackBefore(collideItems.at(nCurIndex);update();)置于頂層void QDrawGraphicsScene:slotLayerTop()QList collideltems =collidingltems(itemSelected);for (int i = collideItems.size()-1; i = 0; -i)collideItems.at(i)-stackBefore(itemSelected);update();置于底層void QDrawGraphicsScene:slotLayerBottom()(QList

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論