Qt GUIにおける線描画の極意:QPainter::drawLine()を使いこなす


Qt GUIは、C++ベースのクロスプラットフォームなGUI開発フレームワークです。QPainterは、Qt GUIにおける描画操作を司る重要なクラスです。その中でも、QPainter::drawLine()関数は、最も基本的な描画機能の一つとして、線を描画するために使用されます。

QPainter::drawLine()の詳細

QPainter::drawLine()関数は、2つの点間の直線を引きます。引数として、以下の2つの点が指定されます。

  • endPoint: 線の終点座標
  • startPoint: 線の始点座標

これらの座標は、ウィジェット座標系におけるピクセル単位で指定されます。

void paintEvent(QPaintEvent *event) {
  QPainter painter(this);
  painter.setPen(Qt::black); // 線の色を黒に設定
  painter.drawLine(10, 20, 200, 300); // (10, 20) から (200, 300) までの線を描画
}

この例では、paintEvent()関数内でQPainter::drawLine()を使用して、黒い線を描画しています。線の始点は(10, 20)、終点は(200, 300)となります。

線のスタイルのカスタマイズ

QPainter::drawLine()関数に加えて、線の色、太さ、スタイルなどをカスタマイズするために、QPenクラスを使用することができます。

void paintEvent(QPaintEvent *event) {
  QPainter painter(this);

  QPen pen(Qt::red); // 線の色を赤に設定
  pen.setWidth(3); // 線の太さを3ピクセルに設定
  pen.setStyle(Qt::DashDotLine); // 線のスタイルを破線にする

  painter.setPen(pen);
  painter.drawLine(50, 40, 350, 250);
}

この例では、QPenクラスを使用して、線のスタイルをカスタマイズしています。線の色は赤、太さは3ピクセル、スタイルは破線となります。



void paintEvent(QPaintEvent *event) {
  QPainter painter(this);

  // 黒い線
  painter.setPen(Qt::black);
  painter.drawLine(10, 20, 200, 300);

  // 赤い線
  painter.setPen(Qt::red);
  painter.drawLine(30, 40, 250, 260);
}

太さの異なる線

void paintEvent(QPaintEvent *event) {
  QPainter painter(this);

  // 太さ1ピクセルの線
  painter.setPen(QPen(Qt::black, 1));
  painter.drawLine(10, 20, 50, 60);

  // 太さ3ピクセルの線
  painter.setPen(QPen(Qt::red, 3));
  painter.drawLine(60, 30, 100, 70);
}

破線の線

void paintEvent(QPaintEvent *event) {
  QPainter painter(this);

  painter.setPen(QPen(Qt::blue, 2));
  painter.setPenStyle(Qt::DashDotLine);

  painter.drawLine(20, 40, 180, 100);
}
void paintEvent(QPaintEvent *event) {
  QPainter painter(this);

  painter.setPen(QPen(Qt::green));

  QPoint points[] = {
    QPoint(30, 50),
    QPoint(80, 120),
    QPoint(130, 90),
    QPoint(180, 60)
  };

  painter.drawLines(points, 4);
}
  • グラデーション付きの線
  • 色付きの線
  • 矢印付きの線


代替方法の選択肢

  1. QPainter::drawPath(): より柔軟な線描画
  • ただし、QPainter::drawLine() よりもコードが複雑になる場合があります。
  • QPainter::drawPath() は、QPainter::drawLine() よりも柔軟な線描画機能を提供します。
  1. QPainter::setRenderHint(QPainter::Antialiasing): 滑らかな線
  • ただし、描画処理が若干重くなる場合があります。
  • 特に斜めの線や細い線を描く場合に有効です。
  • QPainter::setRenderHint(QPainter::Antialiasing) を使用すると、ギザギザが目立たない滑らかな線を描画することができます。
  1. カスタム描画関数: 独自の線描画ロジック
  • より高度な制御が可能になりますが、コード量が増え、複雑さも増します。
  • 必要な線描画ロジックが複雑な場合、QPainter::drawLine() などの既存の関数ではなく、カスタム描画関数を作成することができます。
  1. OpenGL: 高速な描画
  • しかし、Qt GUI の描画機能とは異なる API を使用する必要があるため、習得コストがかかります。
  • 高速な描画が必要な場合、OpenGL を使用して線を描画することができます。

各方法の比較

方法利点欠点適した状況
QPainter::drawLine()シンプルで使いやすい複雑な形状には不向き基本的な線描画
QPainter::drawPath()柔軟な線描画が可能コードが複雑になるベジェ曲線など複雑な形状の描画
QPainter::setRenderHint(QPainter::Antialiasing)滑らかな線描画処理が重くなる滑らかな線描画が必要な場合
カスタム描画関数独自の線描画ロジックコード量が多くなる複雑な線描画ロジックが必要な場合
OpenGL高速な描画習得コストが高い高速な描画が必要な場合

具体的な代替例

  • 破線を描く場合: QPainter::setPenStyle() を使用して、破線のスタイルを設定してから QPainter::drawLine() を使用します。
  • ベジェ曲線を描く場合: QPainter::drawPath() を使用して、ベジェ曲線のパスを作成し、描画します。

QPainter::drawLine() は、Qt GUI における基本的な線描画機能として有用ですが、状況に応じてより適切な代替方法を選択することで、より効率的かつ柔軟な描画を実現することができます。