タイプ QGraphicsLineItem の独自の派生クラスがあり、ここで paint() をオーバーライドして矢印としてレンダリングします。
私のテストラインは160、130、260、230です
そして私の paint() 実装:
void MyQGraphicsLineItem::paint( QPainter* aPainter, const QStyleOptionGraphicsItem* aOption, QWidget* aWidget /*= nullptr*/ )
{
Q_UNUSED( aWidget );
aPainter->setClipRect( aOption->exposedRect );
// Get the line and its angle
QLineF cLine = line();
const qreal cLineAngle = cLine.angle();
// Create two copies of the line
QLineF head1 = cLine;
QLineF head2 = cLine;
// Shorten each line and set its angle relative to the main lines angle
// this gives up the "arrow head" lines
head1.setLength( 12 );
head1.setAngle( cLineAngle+-32 );
head2.setLength( 12 );
head2.setAngle( cLineAngle+32 );
// Draw shaft
aPainter->setPen( QPen( Qt::black, 1, Qt::SolidLine ) );
aPainter->drawLine( cLine );
// Draw arrow head
aPainter->setPen( QPen( Qt::red, 1, Qt::SolidLine ) );
aPainter->drawLine( head1 );
aPainter->setPen( QPen( Qt::magenta, 1, Qt::SolidLine ) );
aPainter->drawLine( head2 );
}
これにより、次のような矢印が描画されます。
私がやりたいことは、データから塗りつぶされた QPolygon を描画できるように、このアイテムの「アウトライン」を計算できるようにすることです。
アウトラインをアニメーション化された「破線」(行進アリ)にしたいので、ペン幅の異なる2本の線を描くなどのショートカットは使用できません。
これは簡単に計算できると思いますが、私の数学のスキルは非常に低いです.次のようにして平行線を作成しようとしています:
- 線の角度を保存します。
- 角度を 0 に設定します。
- 行をコピーします。
- コピーで QLineF::translate() を使用します。
- 両方の線の角度を 1 で保存した値に戻します。これにより、各線の開始位置と終了位置がずれます。
うまくいけば、誰かが私を正しい軌道に乗せて、この行から厚い QPolygonF (またはそれが理にかなっている場合は他のもの) を作成し、ペイント用のアウトラインと塗りつぶしを設定できるようにすることができます。
また、シーンにこれらを 1000 個配置する予定なので、理想的には、実行時間があまりかからない、または最適化する簡単な方法を持つソリューションも必要です。
この画像は私が達成しようとしているものです - 赤い線が私の非常に悪いmspaintの描画試行ではなく、qtの破線であると想像してください!