大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

ラズパイデスクトップでPyQt5入門(19)Painting in PyQt5(1)

著者:國松亜紗子
公開日:2020/04/08
最終更新日:2020/04/08
カテゴリー:技術情報

こんばんは。國松です。
少しお久しぶりです。

今回はPyQt5のPaint機能についてみていきます。
PyQt5ペイントシステムはベクターグラフィックス、画像、アウトラインフォントベースのテキストをレンダリングできます。
描画を行うにはPyQt5 toolkitが提供するペインティングAPIを使用します。

QPinter
QPainterは、ウィジェットおよびその他のペイントデバイスで低レベルのペイントを実行します。 単純な線から複雑な形状まですべてを描画できます。

paintEvent
ペイントはpaintEvent()メソッド内で行われます。ペイントするコードはQPaintオブジェクトのbegin()メソッドとend()メソッドの間に書かれます。

1.Drawing test
ウィンドウのクライアント領域にUnicodeテキストを描画していきます。

#!/usr/bin/python3
#-*-coding: utf-8 -*-

"""
In this example, we draw text in Russian Cylliric.
"""
from PyQt5.QtWidgets import QWidget,QApplication
from PyQt5.QtGui import QPainter,QColor,QFont
from PyQt5.QtCore import Qt
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.text = "лев Николаневич Толстой\n Анна Кареина"

        self.setGeometry(300,330,280,170)
        self.setWindowTitle('Drawing text')
        self.show()

    def paintEvent(self,event):
        qp = QPainter()
        #beginとendの間に描画するためのメソッドを書く
        qp.begin(self)
        self.drawText(event,qp)
        qp.end()

    def drawText(self,event,qp):
    #文字の色を指定
        qp.setPen(QColor(168,34,3))
    #文字のフォントと大きさを指定
        qp.setFont(QFont('Decorative',10))
        qp.drawText(event.rect(),Qt.AlignCenter,self.text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

何故が描画するテキストがロシア語(キリル文字)です。Vimでのロシア語入力については以下のサイトを参考にして下さい。
russian – Vim 日本語ドキュメント
Vimのコマンドモードで:set keymap = russian-juukenwinでロシア語の入力ができる様になります。

qp.drawText(event.rect(),Qt.AlignCenter,self.text)
drawText()はウィンドウにテキストを描画します。
第1引数 更新が必要なメイン画面
第2引数 テキストの描画位置
第3引数 挿入するテキスト

2.Drawing point
ポイント(点は)描画できる最も単純なグラフィックスオブジェクトです。
今回はアプリケーションウィンドウに1000個の赤い点をランダムに描画していきます。

#!/usr/bin/python3
#*- coding: utf-8-*-

"""
In the example.we draw randomly 1000 red points on the window
"""

from PyQt5.QtWidgets import QWidget,QApplication
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
import sys,random

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300,300,300,190)
        self.setWindowTitle('Points')
        self.show()

    def paintEvent(self,e):
        qp = QPainter()
        qp.begin(self)
        self.drawPoints(qp)
        qp.end()

    def drawPoints(self,qp):
        #ペンを赤色に設定
        qp.setPen(Qt.red)
        #ウィンドウのサイズをセット(サイズが変更されるとペイントイベントが発生)
        size = self.size()

        #ランダムに1000個の点を描画
        for i in range(1000):
            x = random.randint(1,size.width()-1)
            y = random.randint(1,size.height()-1)
            #drawPint()メソッドで点を描画
            qp.drawPoint(x,y)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

 

 

ウィンドウのサイズを変更するたびに赤い点が描画され直しています。

    上に戻る