QPainterで色々な図形を描く方法!!

takkun
どうも!たっくんです!

またまた続いて、「QPainter」を見ていきたいと思います!今回は、「色々な図形を描く方法」を見ていきたいと思います!!(`・ω・´)ゞ

QPainter.drawLineの使い方!!

2018.01.23

QPainter.drawRectの使い方!!

2018.01.22

QPainterで画像合成してWidgetに表示する方法!!

2018.01.11

図形の描画

塗りつぶしの設定は「setBrush」、線の設定は「setPen」は、「QPainter.drawRectの使い方!!」でご紹介した方法と一緒です!描画したいものによって、メソッドを使い分けると様々な図形を描くことができます!

円弧(drawArc)

指定したエリアに「startAngle」「spanAngle」によって定義される弧を描画します。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		rectangle = QtCore.QRectF(10.0, 20.0, 80.0, 60.0)
		startAngle = 30 * 16
		spanAngle = 120 * 16
		painter.drawArc(rectangle, startAngle, spanAngle)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

円弧(drawChord)

指定したエリアに「startAngle」「spanAngle」によって定義される弧を描画します。「drawArc」と違い、始点・終点が結ばれます。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		rectangle = QtCore.QRectF(10.0, 20.0, 80.0, 60.0)
		startAngle = 30 * 16
		spanAngle = 120 * 16
		painter.drawChord(rectangle, startAngle, spanAngle)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

凸面の多角形

指定されたポイントで、凸面の多角形を描画します。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		points = [	QtCore.QPointF(10.0, 80.0),
					QtCore.QPointF(20.0, 10.0),
					QtCore.QPointF(80.0, 30.0),
					QtCore.QPointF(90.0, 70.0)
					]
		painter.drawConvexPolygon(points)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

楕円(drawEllipse)

指定したエリアに楕円を描画します。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		rectangle = QtCore.QRectF(10.0, 20.0, 80.0, 60.0)
		painter.drawEllipse(rectangle)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()
指定したエリアが正方形の場合は、正円になります。

扇形(drawPie)

指定されたエリアに、「startAngle」「spanAngle」によって定義される扇形を描画します。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		rectangle = QtCore.QRectF(10.0, 20.0, 80.0, 60.0)
		startAngle = 30 * 16
		spanAngle = 120 * 16
		painter.drawPie(rectangle, startAngle, spanAngle)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

多角形(drawPolygon)

指定されたポイントの多角形を描画します。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		points = [  QtCore.QPointF(10.0, 80.0),
					QtCore.QPointF(20.0, 10.0),
					QtCore.QPointF(80.0, 30.0),
					QtCore.QPointF(90.0, 70.0)
					]
		painter.drawPolygon(points)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

連続した線(drawPolyline)

指定されたポイントを通る線を描画します。始点・終点は閉じられません。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		points = [  QtCore.QPointF(10.0, 80.0),
					QtCore.QPointF(20.0, 10.0),
					QtCore.QPointF(80.0, 30.0)
					]
		painter.drawPolyline(points)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

四角形(drawRect)

指定したエリアに、四角形を描画します。「QPainter.drawRectの使い方!!」でご紹介したものと同じです。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		rectangle = QtCore.QRectF(10.0, 20.0, 80.0, 60.0)
		painter.drawRect(rectangle)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

角の丸い四角形(drawRoundedRect)

指定されたエリアに、「xRadius」「yRadius」によって定義される丸みのある四角形を描画します。

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.lightGray)
		painter.setPen(QtCore.Qt.black)
		
		rectangle = QtCore.QRectF(10.0, 20.0, 80.0, 60.0)
		painter.drawRoundedRect(rectangle, 20.0, 15.0)
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(90, 90)
window.show()

アウトラインだけ描画する方法

追加のテクニックとして、Brushを「QtCore.Qt.NoBrush」に設定することでアウトラインだけ描画することができます!(*´ω`*)b

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setBrush(QtCore.Qt.NoBrush)
		painter.setPen(QtGui.QPen(QtCore.Qt.gray, 5, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
		painter.drawRect(QtCore.QRect(100, 100, 100, 100))
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(720,405)
window.show()

実行してみると、実線5pxでグレーの角がちょーーーーーーーーっと丸い四角形を描画できます!