如何在Qt中使用非不透明图形项控制剪裁?

时间:2009-10-30 07:48:34

标签: c++ qt graphics qt4

我在QGraphicsScene中有一堆QGraphicsSvgItem,由QGraphicsLineItem连接。这个节目是一个树形结构图。

我想要做的是提供一个功能,除了选定的子树之外的所有子树都变得透明。一种“突出这个子树”的功能。这部分很容易,但结果很难看,因为现在可以通过半透明的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)仍然剪切线条,即使它们是半透明的?

1 个答案:

答案 0 :(得分:0)

这里最好的解决方案是将QGraphicsScene和您的图形项子类化。
为场景创建其他类,为不同的图形项创建多个类。 然后,您将为每个项目使用“绘制”方法,您可以使用所需的不透明度进行绘制。
在这种情况下,您还可以解决剪裁问题,因为您可以控制每个项目的形状和边界矩形。
另一个不错的功能是能够在您的实现中将项目链接在一起,这样当您单击某处时,您可以一次设置多个项目的可见性设置。
换句话说,您将对整个场景拥有更多控制权,因此学习和编写这些子类是一项不错的投资。
例如,您可以看到Colliding Mice Example绘制自定义图形项目的位置。