「Krita」と「Python」のクラスでダイアログを使ってみよう

2025年1月30日(木)
大西 武 (オオニシ タケシ)
第12回の今回は「Krita」の「Python」でクラスを使ってダイアログ(QDialog)を継承し、UIを構築する解説をします。

はじめに

今回は第8回で解説した、ダイアログ(QDialog)に付けるUIパーツなどをクラスを継承してプログラミングします。QDialogクラスを継承した「Dialog」クラスを宣言することで、Dialogクラス内でQDialogクラスのメソッドやプロパティが「self.」を付けて使えます。

今回用意したのは「素のダイアログ(QDialog)」「ラベル(QLabel)」「プッシュボタン(QPushButton)」「スライダー(QSlider)」「ラインエディット(QLineEdit)」「フォントコンボボックス(QFontComboBox)」を使ったサンプルです。「フォントコンボボックス(QFontComboBox)」だけ新たに解説しますが、これまでと同様に操作すれば簡単に実装できます。

素のダイアログを継承したクラスを使う

今回のサンプルは全てQDialogを継承したクラスで実装します。QDialogの使い方もクラスの使い方も今まで通りです。クラスを使うと同種の機能であるメソッドやプロパティがDialogクラスにまとめられるので、分別されて分かり易くなりますね。

QDialogクラスを継承したクラス

まずは、素のダイアログにラベル(QLabel)を貼り付けてみましょう。「create」メソッドで出てくる「layout」変数は、プロパティではなく単なる変数なので「self.」も付いていないし、createメソッド外では内容が保持されません。

図1:素のダイアログ

・サンプルスクリプト「dlg_class.py」
01# モジュール
02from PyQt5.Qt import *
03from PyQt5.QtWidgets import QDialog, QHBoxLayout
04# ダイアログクラス
05class Dialog(QDialog):
06  # ドキュメント作成
07  def create_doc(self,width,height):
08    self.doc = Krita.instance().createDocument(width, height, "Line", "RGBA", "U8", "", 300.0)
09    Krita.instance().activeWindow().addView(self.doc)
10  # メイン処理
11  def create(self):
12    self.create_doc(800,800)
13    layout = QHBoxLayout()
14    self.label = QLabel("ラベル")
15    layout.addWidget(self.label)
16    layout.setAlignment(self.label,Qt.AlignHCenter)
17    self.setLayout(layout)
18# ダイアログ作成
19dlg = Dialog()
20dlg.create()
21dlg.setWindowTitle("Dialog")
22dlg.resize(600,400)
23dlg.exec_()

【サンプルスクリプトの解説】
PyQt5内のモジュールを読み込みます。
QDialogクラスを継承したDialogクラスを宣言します。
「create_doc」メソッドはいつも通りです。
createメソッドでドキュメント作成を呼び出してレイアウトに中央寄せした“ラベル”文字列を貼り、レイアウトをダイアログにセットします。
Dialogクラスのインスタンスを生成して実行中(「exec_」メソッド)状態にします。

QDialogクラスを継承してランダムに円を描く

ダイアログにプッシュボタンを1個だけ配置し、これが押されるたびにランダムな位置にランダムな大きさの正円を描きます。正円の数は色相の数に合わせて360個で、正円は色相を0~360未満に変えた半透明の色です。

QPushButtonクラスのclickedのconnectメソッドでクリックして呼び出すフックをする場合も、関数だけでなくメソッドも登録できます。

図2:ボタンを押すごとにランダムに正円を描く

・サンプルスクリプト「dlg_ellipse_class.py」
01# モジュール
02import random
03from PyQt5.Qt import *
04from PyQt5.QtWidgets import QDialog, QHBoxLayout, QPushButton
05# ダイアログクラス
06class Dialog(QDialog):
07(中略)
08  # 円をランダムに描く
09  def draw_ellipse(self):
10    pixmap = QPixmap(self.doc.bounds().size())
11    pixmap.fill(QColor(Qt.transparent))
12    painter = QPainter()
13    painter.begin(pixmap)
14    painter.setRenderHint(QPainter.Antialiasing,True)
15    for i in range(0,360):
16      color = QColor.fromHsl(i, 255, 128, 96)
17      pen = QPen(color)
18      painter.setPen(pen)
19      brush = QBrush(color)
20      painter.setBrush(brush)
21      x = random.randint(0,self.doc.width())
22      y = random.randint(0,self.doc.height())
23      r = random.randint(30,80)
24      painter.drawEllipse(QPoint(x,y),r,r)
25    painter.end()
26    return pixmap.toImage()
27  # ボタンが押されたら
28  def click_button(self):
29    self.img = self.draw_ellipse()
30    self.set_layer()
31    self.doc.refreshProjection()
32  # レイヤーのセット
33  def set_layer(self):
34    root = self.doc.rootNode()
35    layer = root.childNodes()[0]
36    if self.img.sizeInBytes() == 4 * layer.channels()[0].channelSize() * self.doc.width() * self.doc.height():
37      ptr = self.img.bits()
38      ptr.setsize(self.img.byteCount())
39      layer.setPixelData(QByteArray(ptr.asstring()), 0, 0, self.doc.width(), self.doc.height())
40    else:
41      print('Error')
42  # メイン処理
43  def create(self):
44    self.create_doc(800,800)
45    layout = QHBoxLayout()
46    self.button = QPushButton("ランダムに円を描画し直す")
47    layout.addWidget(self.button)
48    self.button.clicked.connect(self.click_button)
49    self.setLayout(layout)
50# ダイアログ作成
51dlg = Dialog()
52dlg.create()
53dlg.exec_()

【サンプルスクリプトの解説】
乱数のモジュールやPyQt5内のモジュールやkritaのモジュールを読み込みます。
「draw_ellipse」メソッドでランダムに正円を描きます。QPenの輪郭もQBrushの塗り潰しも同じQColorの色です。
Dialog内のプッシュボタンが押されたら「click_button」メソッドが呼ばれます。
「set_layer」メソッドはいつも通りです。
createメソッドでドキュメントを作成し、レイアウトにプッシュボタンを配置します。プッシュボタンが押されると「click_button」メソッドが呼ばれ、レイアウトをダイアログにセットします。
Dialogクラスのインスタンスを生成し実行中状態にします。

著者
大西 武 (オオニシ タケシ)
1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書など30冊以上を商業出版する作家。Microsoftで大賞やNTTドコモでグランプリなど20回以上全国区のコンテストに入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」が全国放送のTVで約10回出題。
https://profile.vixar.jp

連載バックナンバー

開発言語技術解説
第15回

「Krita」と「Python」でUIパーツを使って「ドッキングパネル」を構築する

2025/4/11
第15回の今回は「Krita」のメインUIの右側にあるエリアにドッキングするパネルにUIパーツを配置して構築する解説をします。
開発言語技術解説
第14回

「Krita」と「Python」でプラグインを作ろう

2025/3/21
第14回の今回は「Krita」で「Python」スクリプトを「プラグイン」にしたり、「ショートカットキー」をセットする解説をします。
開発言語技術解説
第13回

「Krita」と「Python」でオリジナルの幾何学模様を作ろう

2025/2/27
第13回の今回は「Krita」の「Python」でダイアログUIにUIパーツを貼り付けて操作できるようにして、オリジナルの幾何学模様を作成できるプログラムを解説します。さらにアニメーションも作ります。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています