Qt GUI で円弧を描く:QPainter::drawChord() の詳細解説


QPainter::drawChord() 関数は、Qt GUI において円弧を描画するために使用されます。引数として、円弧を描くための矩形、開始角度、およびスパン角度を指定します。

構文

void QPainter::drawChord(int x, int y, int width, int height, int startAngle, int spanAngle);

void QPainter::drawChord(const QRect &rectangle, int startAngle, int spanAngle);

パラメータ

  • rectangle: 円弧を描画する矩形
  • spanAngle: 円弧を描くスパン角度 (正の整数)
  • startAngle: 円弧の開始角度 (0 度から 359 度までの整数)
  • height: 円弧を描画する矩形の高さ
  • width: 円弧を描画する矩形の幅
  • y: 円弧の中心点の Y 座標
  • x: 円弧の中心点の X 座標

詳細説明

QPainter::drawChord() 関数は、指定された矩形内に、開始角度とスパン角度で指定された円弧を描画します。円弧は、矩形の左上隅を (0, 0) 座標とした座標系で描画されます。

開始角度は、時計回りに 0 度から 359 度までの整数で指定されます。0 度は、矩形の右端と上辺の交点になります。スパン角度は、正の整数で指定され、円弧を描く角度範囲を表します。

以下のコードは、矩形 (10, 20, 100, 80) 内に、45 度から 90 度までの円弧を描画します。

QPainter painter;
painter.begin(widget);

painter.setPen(Qt::black);
painter.setBrush(Qt::green);

painter.drawChord(10, 20, 100, 80, 45, 90);

painter.end();
  • 円弧を描画する矩形は、必ず正方形である必要はありません。
  • 円弧を完全に描画するには、スパン角度を 360 度に設定する必要があります。
  • QPainter::drawChord() 関数は、塗りつぶし (fill) と線描画 (stroke) のどちらか一方、または両方を実行できます。塗りつぶしを行う場合は、setBrush() 関数で塗りつぶしの色を設定する必要があります。線描画を行う場合は、setPen() 関数で線描画の色と太さを設定する必要があります。

QPainter::drawChord() 関数は、Qt GUI において円弧を描画するために使用されます。この関数は、円弧を描画するための矩形、開始角度、およびスパン角度をパラメータとして受け取ります。円弧は、塗りつぶし、線描画、またはその両方のスタイルで描画することができます。



例 1: 単色円弧

この例では、矩形 (10, 20, 100, 80) 内に、45 度から 90 度までの円弧を描画します。円弧は緑色で塗りつぶされます。

QPainter painter;
painter.begin(widget);

painter.setPen(Qt::black);
painter.setBrush(Qt::green);

painter.drawChord(10, 20, 100, 80, 45, 90);

painter.end();

例 2: 線描画の円弧

この例では、矩形 (50, 50, 150, 150) 内に、120 度までの円弧を描画します。円弧は太さ 5 ピクセルの黒い線で描画されます。

QPainter painter;
painter.begin(widget);

painter.setPen(QPen(Qt::black, 5));

painter.drawChord(50, 50, 150, 150, 0, 120);

painter.end();

例 3: 塗りつぶしと線描画の円弧

この例では、矩形 (20, 30, 120, 90) 内に、270 度から 360 度までの円弧を描画します。円弧は青色で塗りつぶされ、太さ 3 ピクセルの赤い線で描画されます。

QPainter painter;
painter.begin(widget);

painter.setPen(QPen(Qt::red, 3));
painter.setBrush(Qt::blue);

painter.drawChord(20, 30, 120, 90, 270, 90);

painter.end();

例 4: 円

この例では、円の中心座標が (50, 50)、半径が 40 の円を描画します。円は緑色で塗りつぶされます。

QPainter painter;
painter.begin(widget);

painter.setPen(Qt::black);
painter.setBrush(Qt::green);

painter.drawChord(10, 10, 80, 80, 0, 360);

painter.end();

例 5: 扇形

この例では、矩形 (30, 40, 100, 60) 内に、135 度から 270 度までの扇形を描画します。扇形は黄色で塗りつぶされます。

QPainter painter;
painter.begin(widget);

painter.setPen(Qt::black);
painter.setBrush(Qt::yellow);

painter.drawChord(30, 40, 100, 60, 135, 135);

painter.end();


QPainter::drawPie() 関数

QPainter::drawPie() 関数は、円弧ではなく扇形を描画するために使用されます。扇形は、円弧と似ていますが、円の中心から放射状に伸びる 2 つの線で定義されます。

長所

  • QPainter::drawChord() 関数よりもシンプルで使いやすい場合があります。
  • 扇形を描画するのに適しています。

短所

  • 円弧を描画することはできません。


QPainter painter;
painter.begin(widget);

painter.setPen(Qt::black);
painter.setBrush(Qt::green);

painter.drawPie(10, 20, 100, 80, 45, 90);

painter.end();

カスタム描画

QPainter::drawPath() 関数を使用して、カスタム パスを定義し、そのパスを使用して円弧を描画することもできます。この方法は、より柔軟な制御が必要な場合に役立ちます。

長所

  • QPainter::drawChord() 関数よりも多くの制御を提供します。
  • 円弧を含む任意の形状を描画できます。

短所

  • QPainter::drawChord() 関数よりも複雑でコード量が多くなります。


QPainter painter;
painter.begin(widget);

painter.setPen(Qt::black);
painter.setBrush(Qt::green);

QPainterPath path;
path.moveTo(50, 50);
path.arcTo(10, 10, 90, 90, 45, 90);
path.lineTo(50, 50);

painter.drawPath(path);

painter.end();

サードパーティライブラリ

長所

  • コードを簡潔にすることができます。
  • 追加機能やパフォーマンスの向上を提供する場合があります。

短所

  • Qt の標準ライブラリの一部ではないため、将来的に非推奨となる可能性があります。
  • ライブラリのインストールと学習が必要となります。


は、2D グラフや図形を描画するための C++ ライブラリです。このライブラリを使用して、円弧を描画することができます。

#include <cmath>
#include <cppgraphs/Renderer.h>

int main() {
  // 円弧を描画する
  cppgraphs::Renderer renderer(800, 600);
  renderer.setBackgroundColor(Qt::white);

  double centerX = 400;
  double centerY = 300;
  double radius = 100;
  double startAngle = 45;
  double spanAngle = 90;

  // 円弧を描画するパスを作成
  QPainterPath path;
  path.moveTo(centerX + radius * cos(startAngle * M_PI / 180), centerY + radius * sin(startAngle * M_PI / 180));
  for (int i = startAngle + 1; i <= startAngle + spanAngle; ++i) {
    double x = centerX + radius * cos(i * M_PI / 180);
    double y = centerY + radius * sin(i * M_PI / 180);
    path.lineTo(x, y);
  }
  path.close();

  // 円弧を描画
  renderer.drawPath(path, Qt::black);

  // 描画結果を画像として保存
  renderer.saveToImage("arc.png");

  return 0;
}

QPainter::drawChord() 関数は、円弧を描画するための汎用的なツールですが、状況によっては代替方法の方が適切な場合があります。上記で紹介した代替方法はそれぞれ長所と短所があるため、要件に応じて最適な方法を選択する必要があります。

  • 描画する円