2

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の設定

もう一度編集:背景の描画が問題のようですが、フルビューポートの更新を使用するとパフォーマンスが低下するため、1つのコアを100%の使用率に固定するのではなく、CPU使用率を3%に維持するように思われます。

// 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 );

次に、シーンはこのブラシをどこでも繰り返し、同じグリッド背景効果をもたらします。ズーム/スケーリングした場合でも期待どおりに機能します。:)。

4

1 に答える 1

2

paint() 関数をオーバーライドする場合、クラスで QGraphicsItem::boundingRect() をオーバーライドして、カスタマイズしたグラフィック アイテムの外側の境界を定義する必要もあります。境界の外に描画すると、レンダリング アーティファクトが発生します。現在、あなたは QGraphicsLineItem の boundingRect() の実装に依存していますが、これはもちろん、paint() 関数の実装に関する知識を持っていません。詳細については、 http://doc.qt.digia.com/main-snapshot/qgraphicsitem.html#boundingRectを参照してください。

于 2012-12-18T17:45:51.007 に答える