【応用例満載】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();
}
このコードを実行すると、以下のようになります。
- ウィジェットをクリックすると、クリック位置に赤い点が描画されます。
- クリックした場所を移動すると、点も一緒に移動します。
- 点のサイズは、
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()
は、点を描画する最もシンプルな方法ですが、柔軟性に欠けます。より柔軟な点描画が必要な場合は、上記の代替方法を検討することをお勧めします。
上記以外にも、QGraphicsItem
や OpenGL
などの技術を使用して点を描画することもできます。