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