\ 迷ったらまずTechAcademyの無料カウンセリング! /
PySide超入門【第20回 | 応用編】QPainterで図形描画!2Dグラフィックス入門

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 | メソッド / プロパティ | 説明 | 例 |
---|---|---|---|
1 | setPen(QPen) | 線の色・太さ・スタイルを設定 | painter.setPen(QPen(QColor("red"), 2)) |
2 | setBrush(QBrush) | 塗りつぶしの色やパターンを設定 | 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(50, 50, "Hello") |
7 | setFont(QFont) | フォント設定 | painter.setFont(QFont("Arial", 14)) |
8 | setRenderHint(QPainter.RenderHint) | 描画品質(アンチエイリアスなど)を設定 | painter.setRenderHint(QPainter.Antialiasing) |
9 | rotate(angle) | 座標系を回転 | painter.rotate(45) |
10 | translate(dx, dy) | 座標系を平行移動 | painter.translate(50, 50) |
11 | scale(sx, sy) | 座標系を拡縮 | painter.scale(2, 2) |
12 | drawPixmap(x, y, QPixmap) | 画像を描画 | painter.drawPixmap(0, 0, pixmap) |
13 | begin(QPaintDevice) / end() | 手動で描画の開始・終了 | painter.begin(self) |
14 | save() / restore() | 描画状態の保存・復元 | painter.save() |
15 | setOpacity(opacity) | 描画の透明度設定 | painter.setOpacity(0.5) |
16 | fillRect(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 = OFF | QPainter.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)
やQWidget
のsetAttribute(Qt.WA_OpaquePaintEvent)
を使うと改善することがあります。 - QPainterで画像ファイルを読み込んで描けますか?
-
はい。
QPixmap
やQImage
を使って読み込み、drawPixmap()
で描画できます。 - 描画順序はどうなりますか?
-
コードで書いた順に描画され、後に描いたものが前面に表示されます。
- 動的に描画内容を変えるには?
-
プロパティを更新して
update()
を呼び、paintEvent()
を再実行します。
まとめ
QPainterは、PySide6で自由な2D描画を行うための中心的なクラスです。
線・塗り・テキスト・画像を自在に描くことができ、カスタムウィジェットやゲーム、デザインツール作りに欠かせません。
次回は、このQPainterを使ったアニメーション描画に挑戦します。動きのあるグラフィックスを作って、アプリの魅力をさらに高めましょう。
コメント