7

どうすれば涙のような形を描くことができますか? QPen は形状ごとに描画するため、複数の形状 (楕円と多角形) を使用せずに描画する必要があります。図形を結合して新しい図形を作成するか、QT に両方の図形の境界線を結合するように指示する必要があります。たとえば、次のようになります。

破れ目

4

2 に答える 2

20

リンクした画像のように、描画したい形状を他の形状のレイヤーとして表すことができる場合は、非常に簡単です。

まずQPainterPath、形状の外縁を表すaを作成する必要があります。より単純な形状を重ねることで構築します。あなたの例の場合、円と正方形が必要です。の使用に注意してくださいQPainterPath::setFillRule(Qt::WindingFill):これは後でパスのペイント方法に影響します(違いを確認するには、パスを削除してみてください!)。

QPainterPath OuterPath;
OuterPath.setFillRule(Qt::WindingFill);
OuterPath.addEllipse(QPointF(60, 60), 50, 50);
OuterPath.addRect(60, 10, 50, 50);

あなたが与えた例では、塗りつぶされた形状の中心から円形の領域も削除する必要があります。その内側の「境界線」をaとして表し、QPainterPathそれを使用QPainterPath::subtracted()して減算InnerPathOuterPath、最終的な形状を生成しましょう。

QPainterPath InnerPath;
InnerPath.addEllipse(QPointF(60, 60), 20, 20);

QPainterPath FillPath = OuterPath.subtracted(InnerPath);

シェイプパスを作成したら、それらを使用してシェイプを塗りつぶしたり、輪郭を描いたりする必要があります。QPainterまず、を作成し、アンチエイリアスを使用するように設定しましょう。

QPainter Painter(this);
Painter.setRenderHint(QPainter::Antialiasing);

次に、作成した形状を塗りつぶす必要があります。

Painter.fillPath(FillPath, Qt::blue);

最後に、アウトラインをペイントしましょう。内側の境界線と外側の境界線に別々のパスがあるため、各境界線を異なる線の太さでストロークできることに注意してください。の使用にも注意してください:これは、レイヤー化された形状のセットを交差のないQPainterPath::simplified()ものに変換します:QPainterPath

Painter.strokePath(OuterPath.simplified(), QPen(Qt::black, 1));
Painter.strokePath(InnerPath, QPen(Qt::black, 3));

これらすべてをまとめると、次のようになります。

void Shape::paintEvent(QPaintEvent *)
{
  QPainterPath OuterPath;
  OuterPath.setFillRule(Qt::WindingFill);
  OuterPath.addEllipse(QPointF(60, 60), 50, 50);
  OuterPath.addRect(60, 10, 50, 50);

  QPainterPath InnerPath;
  InnerPath.addEllipse(QPointF(60, 60), 20, 20);

  QPainterPath FillPath = OuterPath.subtracted(InnerPath);

  QPainter Painter(this);
  Painter.setRenderHint(QPainter::Antialiasing);

  Painter.fillPath(FillPath, Qt::blue);
  Painter.strokePath(OuterPath.simplified(), QPen(Qt::black, 1));
  Painter.strokePath(InnerPath, QPen(Qt::black, 3));
}
于 2012-11-11T14:51:24.417 に答える
3

これは、数学の素養がなければ実際には非常に困難です。その形状を作成する式を知っていれば、それを関数に入れることができますQGraphicsItem::paint()。ただし、いくつかの代替手段があります。

  1. Inkscape (無料) などのベクター編集プログラムで画像を作成し、.svg ファイルとして保存してから、QGraphicsSvgItemに読み込みます。(これは私がすることです。)

  2. QPainterPath::cubicTo()を見てください。これにより、ベジエ曲線を作成できます

于 2012-11-10T10:17:34.553 に答える