首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsLineItem::paint()工件

QGraphicsLineItem::paint()工件
EN

Stack Overflow用户
提问于 2012-12-18 21:05:17
回答 1查看 2.3K关注 0票数 2

我有自己的类,它继承自QGraphicsLineItem并覆盖paint()方法,以绘制一条带有箭头的粗线:

代码语言:javascript
复制
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上设置了一个厚度,这让我相信我一定是在项目矩形之外绘制的。

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

请注意,背景不会在图像中重新绘制-这也会发生在拖动箭头的场景中的任何其他对象上。

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

Subclassing QGraphicsView and setting drawBackground

再次编辑:绘制背景似乎是问题所在,但使用全视图端口更新会降低性能,所以我想出了这个方法,它似乎将CPU使用率保持在3%,而不是将一个内核的使用率限制在100%。

代码语言:javascript
复制
// 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 );

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-19 01:45:51

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13933699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档