2015-05-18 48 views
2

我正在QGraphicsScene上添加項目。一旦添加,項目可能會被進一步處理。如何跳過被相同的QGraphicsItems遮蔽的QGraphicsItems?

我想跳過被其他物品完全遮擋的物品。似乎有幾個QGraphicsItems致力於這項任務。

給定兩個QGraphicsItem對象,在一個矩形的形狀,在尺寸相同的,僅由顏色不同的,並且每個具有相同boundingRect(),每個在完全相同的pos(),但具有不同的zValue()

for(int i = 0; i < scene.items().size(); ++i) 
{ 
    if(scene.items().at(i)->isObscured()) 
    { 
     continue; 
    } 
    // do work 
} 

我也試過

if(scene->items().at(i)->isObscured(scene->items().at(i)->boundingRect())) 

這兩個選項都不會跳過看不見的項目。

如果我稍微增加頂部矩形的大小,isObscured函數可以工作(任一版本)。但是,具有相同的形狀,一個在另一個,邏輯上的底部一個仍然被遮蔽的頂部...

會在合理的修正是在矩形的每一側添加1個像素?那會不會導致奇怪的情況?

如何讓被覆蓋的物品被跳過?

如果一件商品被其他幾件商品所覆蓋,那麼這個問題就更加複雜了,它們都沒有完全覆蓋商品。

回答

0

如果我稍微增加頂部矩形的大小,isObscured函數可以工作(任一版本)。但是,具有相同的形狀,一個在另一個,邏輯上的底部一個仍然被遮蔽的頂部...

在爲QGraphicsItem::isObscuredBy(QGraphicsItem* item)的文件,它規定: -

基本實現地圖項opaqueArea()到這個物品的座標系統,然後檢查這個物品的boundingRect()是否完全包含在映射的形狀中。

尋找在不透明區域和映射的形狀,這是關係到opaqueArea函數其中規定: - 如果它是使用一個不透明的刷或顏色(即填充

的區域是不透明的,而不是透明)。

有兩個相同的項目,它不是比較的邊界矩形的面積,但的QGraphicsItem與其他項目的boundingRect的opaqueArea。

如果兩個項目在相同的情況下失敗,但是顏色不同,則返回的第一個項目的opaqueArea與第二個項目的邊界矩形不匹配。

+0

那麼我該怎麼辦?這兩個項目是相同的,在該試驗中,用每一個都具有()塗在boundingRect固體刷矩形和沒有邊框。擴大項目是不是一種選擇,這應該是通用的... – Thalia

+0

哦,我看到......默認實現返回一個空的QPainterPath,指示這個項目是完全透明的.'這意味着我必須添加一個實現opaqueArea'匹配對象的形狀......但是當物品有透明畫筆或組合時,我該如何處理案例... – Thalia

+0

正如它聲明isObscuredBy「您可以重新實現此功能以提供用於確定此項目是否被項目遮擋的自定義算法。「 – TheDarkKnight

相關問題