【応用例満載】Qt GUIプログラミング:QPainter::drawPoint()を駆使して点描画をマスター


QPainter::drawPoint() は、Qt GUI プログラミングにおいて、指定された座標に点を描画するための関数です。これは、最も基本的な描画操作の一つであり、様々なグラフィカル表現の基盤となります。

関数詳細

void QPainter::drawPoint(const QPoint &point);

この関数は、QPoint 型の引数 point を受け取り、その座標 (point.x(), point.y()) に点を描画します。描画される点のサイズは、ペインターの設定やデバイスの解像度によって異なります。

QPainter painter(widget);
painter.setPen(Qt::red);
painter.drawPoint(100, 50);

この例では、widget ウィジェット上に赤い点を描画します。点は、(100, 50) という座標に配置されます。

  • 点は、アンチエイリアス処理されます。つまり、周辺ピクセルとの滑らかな描画が行われます。
  • 点の色は、QPainter::setPen() 関数で設定したペンの色によって決まります。デフォルトでは、黒色の点を描画します。
  • 描画される点のサイズは、QPainter::setPen() 関数で設定したペンの幅によって決まります。デフォルトでは、1 ピクセルの幅の点を描画します。
  • ゲームにおけるオブジェクトの表現
  • クリック位置の可視化
  • チャートやグラフのデータポイントの表示


#include <QApplication>
#include <QLabel>
#include <QPainter>
#include <QMouseEvent>

class ClickPointWidget : public QLabel {
public:
    ClickPointWidget(QWidget *parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void paintEvent(QPaintEvent *event) override;
};

ClickPointWidget::ClickPointWidget(QWidget *parent) : QLabel(parent) {
    setMouseTracking(true);
}

void ClickPointWidget::mousePressEvent(QMouseEvent *event) {
    // クリック位置を記憶
    clickPoint = event->pos();

    // ウィジェットの再描画を要求
    update();
}

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

    // 背景を白色で塗りつぶす
    painter.fillRect(event->rect(), Qt::white);

    // クリック位置に点を描画
    if (clickPoint.isValid()) {
        painter.setPen(Qt::red);
        painter.drawPoint(clickPoint);
    }
}

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    ClickPointWidget widget;
    widget.setWindowTitle("Click Point");
    widget.show();

    return app.exec();
}

このコードを実行すると、以下のようになります。

  1. ウィジェットをクリックすると、クリック位置に赤い点が描画されます。
  2. クリックした場所を移動すると、点も一緒に移動します。
  • 点のサイズは、QPainter::setPen() 関数で設定したペンの幅によって決まります。
  • ペンの色は、QPainter::setPen() 関数で設定することができます。
  • paintEvent() 関数内で、clickPoint が有効であれば、その座標に赤い点を描画しています。
  • このコードでは、clickPoint 変数を使用して、クリック位置を記憶しています。


QPainter::drawLine()

この関数は、2 つの点を結ぶ線を描画します。点を描画したい場合は、始点と終点を同じ座標に設定することで実現できます。

QPainter painter(widget);
painter.setPen(Qt::red);
painter.drawLine(100, 50, 100, 50);

この例では、(100, 50) という座標に赤い点を描画します。QPainter::drawPoint() と比較すると、以下の点が異なります。

  • アンチエイリアス処理の影響を受けません。QPainter::drawPoint() で描画される点よりもギザギザした見た目になります。
  • 描画される線は、ペンの幅によって太さが決まります。QPainter::drawPoint() で描画される点よりも太くなります。

QPixmap::fill()

この関数は、ピクセルマップを単一の色で塗りつぶします。点を描画したい場合は、ピクセルマップのサイズを 1x1 ピクセルに設定し、そのピクセルを塗りつぶすことで実現できます。

QPixmap pixmap(1, 1);
pixmap.fill(Qt::red);

QPainter painter(widget);
painter.drawPixmap(100, 50, pixmap);
  • アンチエイリアス処理の影響を受けません。QPainter::drawPoint() で描画される点よりもギザギザした見た目になります。
  • 描画される点は、ピクセルマップの解像度に依存します。高解像度であれば、より滑らかな点を描画できます。

カスタム描画ウィジェット

この方法は、より柔軟な点描画を実現できます。描画したい点のサイズ、色、アンチエイリアス処理などを自由に設定することができます。

class PointWidget : public QWidget {
public:
    PointWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *event) override;
};

PointWidget::PointWidget(QWidget *parent) : QWidget(parent) {
}

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

    // 描画したい点のサイズ、色、アンチエイリアス処理などを設定
    painter.setPen(Qt::red);
    painter.setBrush(Qt::red);
    painter.setRenderHint(QPainter::Antialiasing);

    // 点を描画
    painter.drawEllipse(50, 50, 10, 10);
}

この例では、(50, 50) という座標に、赤い色のアンチエイリアス処理された楕円を描画します。QPainter::drawPoint() と比較すると、以下の点が異なります。

  • 処理速度が遅くなる可能性があります。
  • 描画される点は、より柔軟にカスタマイズできます。

QPainter::drawPoint() は、点を描画する最もシンプルな方法ですが、柔軟性に欠けます。より柔軟な点描画が必要な場合は、上記の代替方法を検討することをお勧めします。

上記以外にも、QGraphicsItemOpenGL などの技術を使用して点を描画することもできます。