我有自己的类,它继承自QGraphicsLineItem
并覆盖paint()
绘制带箭头的粗线的方法:
void MyGraphicsItem::paint( QPainter* aPainter,
const QStyleOptionGraphicsItem* aOption,
QWidget* aWidget /*= nullptr*/ )
{
Q_UNUSED( aOption );
Q_UNUSED( aWidget );
QLineF cLine = line();
aPainter->setPen( QPen( Qt::black, 6, Qt::SolidLine ) );
aPainter->drawLine( cLine );
qreal lineAngle = cLine.angle();
const qreal radius = 2.0;
QLineF head1 = cLine;
head1.setAngle(lineAngle+32);
head1.setLength( 12 );
QLineF head2 = cLine;
head2.setAngle(lineAngle-32);
head2.setLength( 12 );
aPainter->drawLine( head1 );
aPainter->drawLine( head2 );
aPainter->setPen( QPen( Qt::yellow, 2, Qt::SolidLine ) );
aPainter->drawLine( cLine );
aPainter->drawLine( head1 );
aPainter->drawLine( head2 );
}
当我在场景周围绘制项目时,这似乎会导致渲染伪影。据我所知,因为我已经设置了厚度QPen
这让我相信我一定是在项目矩形之外绘制的?
是什么导致了我的渲染问题以及如何解决它?
请注意,图像中的背景没有被重新绘制 - 这也发生在场景中箭头被拖动的任何其他对象上。
编辑:我认为这实际上是我的问题:
子类化QGraphicsView并设置drawBackground https://stackoverflow.com/questions/10709694/subclassing-qgraphicsview-and-setting-drawbackground?rq=1
再次编辑:似乎绘制背景是问题所在,但使用全视图端口更新会降低性能,因此我想出了这个方法,它似乎将 CPU 使用率保持在 3%,而不是将一个核心固定为 100% 使用率。
// This code lives in the QGraphicsScene constructor, doesn't have to be there though since QGraphicsScene::setBackgroundBrush is public.
int gridSizeX = 25;
int gridSizeY = 20;
QImage singleGrid( gridSizeX, gridSizeY, QImage::Format_RGB32 );
singleGrid.fill( Qt::white );
{
QPainter painter( &singleGrid );
// Lighter background
painter.setPen( QPen( QColor( 240, 240, 240 ) ));
qreal midx = gridSizeX / 2;
qreal midy = gridSizeY / 2;
painter.drawLine( 0, midy, gridSizeX, midy );
painter.drawLine( midx, 0, midx, gridSizeY );
// Darker foregound
painter.setPen( QPen( QColor( 180, 180, 180 ) ));
painter.drawRect( 0, 0, gridSizeX, gridSizeY );
painter.end();
}
QBrush brushBackground( singleGrid );
setBackgroundBrush( brushBackground );
然后场景在各处重复此画笔,产生相同的网格背景效果,甚至在缩放/缩放时按预期工作。 :)。