gpt4 book ai didi

c++ - QGraphicsLineItem::paint() 工件

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:44 25 4
gpt4 key购买 nike

我有自己的类,它继承自 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 上设置了厚度,这让我相信我必须以某种方式在项目矩形之外绘制?

是什么导致了我的渲染问题,我该如何解决?

enter image description here

请注意图像中的背景没有被重新绘制 - 这也发生在场景中箭头被拖过的任何其他对象上。

编辑:我认为这实际上是我的问题:

Subclassing QGraphicsView and setting drawBackground

再次编辑:似乎绘制背景是个问题,但使用完整的 View 端口更新会降低性能,所以我想出了这个似乎将 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 );

然后场景在各处重复此笔刷,产生相同的网格背景效果,甚至在缩放/缩放时也能按预期工作。 :).

最佳答案

当您覆盖 paint() 函数时,您还需要在您的类中覆盖 QGraphicsItem::boundingRect() 以定义自定义图形项的外边界。如果您在边界外绘制,您最终会出现渲染瑕疵。现在你依赖于 QGraphicsLineItem 的 boundingRect() 实现,它当然不知道你对 paint() 函数的实现。参见 http://doc.qt.digia.com/main-snapshot/qgraphicsitem.html#boundingRect了解详情。

关于c++ - QGraphicsLineItem::paint() 工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13933699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com