2009-10-30 80 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