QPainter.drawLineの使い方!!




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

前回に続き、「QPainter」を見ていきたいと思います!今回は「線の描画(drawLine)」です!(*´ω`*)b

QPainter.drawRectの使い方!!

2018.01.22

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

2018.01.11

線の描画

線の設定は「setPen」で行い、「drawLine」を使うことで指定した線を描くことができます(`・ω・´)ゞ

setPen

色だけ(QtCore.Qt.GlobalColor または QtGui.QColor)」「アウトラインのスタイル(QtCore.Qt.PenStyle)」「色とスタイル(QtGui.QPen)」の3種類の設定方法があります。

# 色(QtCore.Qt.GlobalColor)だけ指定(アウトラインのスタイルは変えられません)
painter.setPen(QtCore.Qt.black)

# アウトラインのスタイルだけ指定(色は変えられません)
painter.setPen(QtCore.Qt.SolidLine)

# QPenで指定
painter.setPen(QtGui.QPen(QtCore.Qt.black, 5, QtCore.Qt.SolidLine))

QPen

先の描画では、QPenを使うと色々な線を引けるようになります!特に「Cap Style」で線の終始の形を設定出来ます。この辺は、イラレやフォトショのパスと似ているところがあります!(`・ω・´)ゞ

# 実線 5pxの黒い線で、線の両端を丸める
painter.setPen(QtGui.QPen(QtCore.Qt.black, 5, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap))

drawLine

線をQLine・QLineF」「始点・終点をQPoint・QPointF」「始点・終点を、座標(x,y)」の5種類の設定方法があります。

# QLineFで指定
painter.drawLine(QtCore.QLineF(10.0, 80.0, 90.0, 20.0))

# QPointFで指定
painter.drawLine(QtCore.QPointF(10.0, 80.0), QtCore.QPointF(90.0, 20.0))

# XYで指定
painter.drawLine(10.0, 80.0, 90.0, 20.0)

横10等分に線を引く

「self.rect」で取得したwidgetのエリアを元に、横を10等分にした縦線を作ってみたいと思います!

from PySide import QtCore, QtGui

class PainterSample(QtGui.QWidget):
	def paintEvent(self, event):
		painter = QtGui.QPainter(self)
		painter.begin(self)
		
		painter.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine))
		
		# 分割数
		split = 10
		
		# widgetのエリアを取得
		rect = self.rect()
		
		# widgetの幅を分割数で割り、間隔を求める
		stepWidth = rect.width() / float(split)
		
		# 分割数だけ繰り返す
		for i in range(0, split):
		
			# 繰り返し回数と間隔を掛け算して、位置を求める
			x = stepWidth * i
			
			# 線の描画
			painter.drawLine(x, 0, x, rect.height())
		
		
window = PainterSample()
window.setWindowFlags(QtCore.Qt.Window)
window.resize(720,405)
window.show()

実行してみると、左の線がちょっと見づらいですが10等分した線を引けました!

線を太くして、下側だけ線を引けば、MayaのTime Lineっぽくなりますね!(*´ω`*)b







Maya x Pythonの技術書
たっきゅんのガチンコツール開発部 Maya Python 101
(CG Pro Insights)

もっとMayaを便利に使いませんか!?実用性のあるツールを例にPythonが学べるように、がんばって執筆させていただきました!是非、この機会によろしくお願いいたします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です