PySide超入門【第20回 | 応用編】QPainterで図形描画!2Dグラフィックス入門

\ 迷ったらまずTechAcademyの無料カウンセリング! /

GUIアプリケーションでは、ボタンやテキストだけでなく、図形やグラフィックスを自由に描画したい場面があります。
例えば、グラフ、カスタムUI、ゲーム画面、デザインツールなどは、プログラムから線や四角形、円を直接描きます。

PySide6 では、その役割を担うのが QPainter です。
QPainter を使うことで、ウィジェットや画像に対して線・塗り・テキスト・画像を自在に描き込めます。

今回は、QPainter の使い方、よく使うプロパティやメソッド、そして実際のコード例を通して、2D描画の第一歩を解説します。

目次

QPainterとは?

QPainter は、Qtの描画エンジンで、指定したペイントデバイス(例:QWidget、QPixmap、QImageなど)に描画を行います。
描画処理は主にpaintEvent() の中で行い、QPainterのインスタンスを作成してから図形や文字を描きます。

基本コード

from PySide6.QtWidgets import QApplication, QWidget
from PySide6.QtGui import QPainter, QColor, QPen
import sys

class PaintWidget(QWidget):
    def paintEvent(self, event):
        painter = QPainter(self)  # QPainterを初期化
        painter.setPen(QPen(QColor("blue"), 3))  # ペン色と太さ
        painter.setBrush(QColor("skyblue"))      # 塗りつぶし色
        painter.drawRect(50, 50, 200, 100)       # 四角形を描画

app = QApplication(sys.argv)
window = PaintWidget()
window.resize(300, 200)
window.show()
sys.exit(app.exec())
  • paintEvent(self, event) 内で描画処理を書く
  • QPainter(self)self は描画対象(ここではウィジェット)
  • setPen() で線の色・太さを設定
  • setBrush() で塗りつぶし色を設定
  • drawRect() で長方形を描画

主なプロパティとメソッド一覧(全解説)

Noメソッド / プロパティ説明
1setPen(QPen)線の色・太さ・スタイルを設定painter.setPen(QPen(QColor("red"), 2))
2setBrush(QBrush)塗りつぶしの色やパターンを設定painter.setBrush(QColor("yellow"))
3drawLine(x1, y1, x2, y2)線を描画painter.drawLine(0, 0, 100, 100)
4drawRect(x, y, w, h)長方形を描画painter.drawRect(10, 10, 80, 40)
5drawEllipse(x, y, w, h)楕円・円を描画painter.drawEllipse(50, 50, 80, 80)
6drawText(x, y, text)文字列を描画painter.drawText(50, 50, "Hello")
7setFont(QFont)フォント設定painter.setFont(QFont("Arial", 14))
8setRenderHint(QPainter.RenderHint)描画品質(アンチエイリアスなど)を設定painter.setRenderHint(QPainter.Antialiasing)
9rotate(angle)座標系を回転painter.rotate(45)
10translate(dx, dy)座標系を平行移動painter.translate(50, 50)
11scale(sx, sy)座標系を拡縮painter.scale(2, 2)
12drawPixmap(x, y, QPixmap)画像を描画painter.drawPixmap(0, 0, pixmap)
13begin(QPaintDevice) / end()手動で描画の開始・終了painter.begin(self)
14save() / restore()描画状態の保存・復元painter.save()
15setOpacity(opacity)描画の透明度設定painter.setOpacity(0.5)
16fillRect(x, y, w, h, color)長方形を塗りつぶすpainter.fillRect(0, 0, 100, 50, QColor("green"))

各プロパティ・メソッド 詳細解説

【1】線の設定

概要: 線の色・太さ・スタイルを設定します。
メソッド: setPen(QPen)
使い方:

from PySide6.QtGui import QPen, QColor
painter.setPen(QPen(QColor("red"), 2))

【2】塗りつぶしの設定

概要: 図形内部の色やパターンを設定します。
メソッド: setBrush(QBrush)
使い方:

from PySide6.QtGui import QColor
painter.setBrush(QColor("yellow"))

【3】線の描画

概要: 始点と終点を指定して直線を描きます。
メソッド: drawLine(x1, y1, x2, y2)
使い方:

painter.drawLine(0, 0, 100, 100)

【4】長方形の描画

概要: 位置と幅・高さを指定して長方形を描きます。
メソッド: drawRect(x, y, w, h)
使い方:

painter.drawRect(10, 10, 80, 40)

【5】楕円・円の描画

概要: 指定した矩形内に収まる楕円を描きます。正方形の場合は円になります。
メソッド: drawEllipse(x, y, w, h)
使い方:

painter.drawEllipse(50, 50, 80, 80)

【6】文字列の描画

概要: 指定位置にテキストを描画します。
メソッド: drawText(x, y, text)
使い方:

painter.drawText(80, 80, "Hello QPainter")

【7】フォントの設定

概要: 描画する文字のフォント・サイズを設定します。
メソッド: setFont(QFont)
使い方:

from PySide6.QtGui import QFont
painter.setFont(QFont("Arial", 14))
painter.drawText(80, 80, "Hello QPainter")

【8】描画品質の設定

概要: アンチエイリアスなどの描画品質を設定します。
メソッド: setRenderHint(QPainter.RenderHint)
使い方:

painter.setPen(QPen(QColor("red"), 3))  # ペン色と太さ
painter.drawText(30, 30, "QPainter.Antialiasing = ON")

# 描画品質を設定
painter.setRenderHint(QPainter.Antialiasing)
painter.drawEllipse(50, 50, 80, 80)
QPainter.Antialiasing = OFFQPainter.Antialiasing = ON

【9】回転

概要: 座標系を指定角度回転します。
メソッド: rotate(angle)
使い方:

painter.rotate(45)  # 回転
painter.drawRect(50,b 50, 100, 50)       # 四角形を描画
painter.rotate(0)painter.rotate(45)

【10】平行移動

概要: 描画座標系を移動します。
メソッド: translate(dx, dy)
使い方:

painter.translate(50, 50) # 移動
painter.drawRect(50, 50, 100, 50)       # 四角形を描画
painter.translate(0, 0)painter.translate(50, 50)

【11】拡大・縮小

概要: 座標系を拡大または縮小します。
メソッド: scale(sx, sy)
使い方:

painter.scale(2, 2)
painter.scale(0, 0)painter.scale(2, 2)

【12】画像の描画

概要: QPixmapやQImageを表示します。
メソッド: drawPixmap(x, y, pixmap)
使い方:

from PySide6.QtGui import QPixmap
pixmap = QPixmap("sample.png")
painter.drawPixmap(0, 0, pixmap)

【13】描画開始・終了

概要: begin/endで描画処理を明示的に管理します。
メソッド: begin(QPaintDevice) / end()
使い方:

painter.begin(self)
# 描画処理
painter.end()

【14】状態の保存・復元

概要: 現在のペンやブラシなどの設定を保存・復元します。これにより,一時的な色や変換の変更が他の描画に影響しないようにできます
メソッド: save() / restore()
使い方:

painter.setBrush(QColor("yellow")) # 塗りつぶし:黄色
painter.save() # 黄色の塗りつぶしを保存
painter.setBrush(QColor("red")) # 塗りつぶし:赤色
painter.restore() #保存した塗りつぶし設定を復元 
painter.drawRect(50, 50, 100, 50)  # 四角形を描画

【15】透明度設定

概要: 描画の不透明度を設定します。
メソッド: setOpacity(opacity)
使い方:

painter.setOpacity(0.5)

【16】長方形を塗りつぶす

概要: 単色やブラシで矩形を塗ります。
メソッド: fillRect(x, y, w, h, color)
使い方:

painter.fillRect(0, 0, 100, 50, QColor("green"))

よくある質問(FAQ)

QPainterはどこで使えばいいですか?

基本的には paintEvent() 内で使います。直接呼び出すより、Qtの描画サイクルに任せたほうが安全です。

描画がちらつくのですが?

setRenderHint(QPainter.Antialiasing)QWidgetsetAttribute(Qt.WA_OpaquePaintEvent) を使うと改善することがあります。

QPainterで画像ファイルを読み込んで描けますか?

はい。QPixmapQImage を使って読み込み、drawPixmap() で描画できます。

描画順序はどうなりますか?

コードで書いた順に描画され、後に描いたものが前面に表示されます。

動的に描画内容を変えるには?

プロパティを更新して update() を呼び、paintEvent() を再実行します。

まとめ

QPainterは、PySide6で自由な2D描画を行うための中心的なクラスです。
線・塗り・テキスト・画像を自在に描くことができ、カスタムウィジェットやゲーム、デザインツール作りに欠かせません。

次回は、このQPainterを使ったアニメーション描画に挑戦します。動きのあるグラフィックスを作って、アプリの魅力をさらに高めましょう。

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次