2009-10-30 147 views
0

我有一堆QGraphicsSvgItem的QGraphicsScene繪製由QGraphicsLineItem的連接。這個節目是一個樹形結構圖。如何用Qt中的非透明圖形項控制裁剪?

我想要做的是提供一個功能,其中除了選定的子樹以外的所有東西都變得透明。一種「突出這個子樹」的功能。這部分很容易,但結果很難看,因爲現在可以通過半透明的svg來看到這些線條。

我正在尋找一些方法來將其他QGraphicsItem的場景剪貼到svg項目中,從而給出svg是背景半透明窗口的效果。

我知道這段代碼不使用SVG,但我想你可以自己替換,如果你這麼傾向。

int main(int argc, char *argv[]) { 
    QApplication app(argc, argv); 
    QGraphicsScene scene; 
    for(int i = 0; i < 10; ++i) { 
     QGraphicsLineItem* line = new QGraphicsLineItem; 
     line->setLine(i * 25.0 + 1.0, 0, i * 25.0 + 23.0, 0); 
     scene.addItem(line); 
    } 

    for(int i = 0; i < 11; ++i) { 
     QGraphicsEllipseItem* ellipse = new QGraphicsEllipseItem; 
     ellipse->setRect((i * 25.0) - 9.0, -9.0, 18.0, 18.0f); 
     ellipse->setBrush(QBrush(Qt::green, Qt::SolidPattern)); 
     ellipse->setOpacity(0.5); 
     scene.addItem(ellipse); 
    } 
    QGraphicsView view(&scene); 
    view.show(); 
    return app.exec(); 
} 

我希望線條在圈子後面不被看到。我已經嘗試使用opengl渲染來處理深度緩衝區和模板緩衝區,但無濟於事。

如何獲取QGraphicsSvgItem(或示例代碼中的QGraphicsEllipseItem)即使它們是半透明仍然會剪切這些行?

+0

哦,任何想看完整源代碼的人都可以去http://github.com/jjacobsson/calltree/tree/cts – JJacobsson 2009-10-30 07:49:22

回答

0

這裏最好的解決方案是繼承QGraphicsScene和圖形項目。
爲場景創建其他類併爲不同圖形項目創建多個類。 然後,您將爲每個項目繪製「繪畫」方法,您可以在其中繪製所需的不透明度。
在這種情況下,您將能夠解決裁剪問題,因爲您可以控制每個項目的形狀和邊界矩形。
另一個不錯的功能是將項目鏈接在實現中的功能,以便當您單擊某處時,可以一次設置多個項目的可見性設置。
換句話說,您將對整個場景擁有更多的控制權,因此學習和編寫這些子類是一次不錯的投資。
例如,您可以在其中繪製自定義圖形項目的地方看到Colliding Mice Example

+0

是的。我這樣做。但無論我如何修改對象的繪畫,我都無法得到我想要的結果。 儘管碰撞小鼠示例看起來會更困難。 – JJacobsson 2009-10-30 10:10:36