Ubuntu Weekly Recipe

第424回 GUIプログラムをPython/Ruby/ECMAScriptで書く

この記事を読むのに必要な時間:およそ 6.5 分

Qt5を利用したGUIプログラム

前章で確認した共通の処理は,他のプログラミング言語やGUIツールキットにも見出すことができます。

そこで,Python 3のQt5バインディングを利用してプログラムを書いてみました。

#!/usr/bin/env python3

from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout
from PyQt5.QtWidgets import QToolButton, QGroupBox, QLineEdit, QLabel

from gi.repository import GLib
import signal

class Sample(QWidget):
    def __init__(self, parent=None):
        super(Sample, self).__init__(parent)

        self.setWindowTitle("PyQt5 sample")

        layout = QVBoxLayout()
        self.setLayout(layout)

        top_grp = QGroupBox(self)
        top_layout = QHBoxLayout()
        top_grp.setLayout(top_layout)
        layout.addWidget(top_grp)

        buttom_grp = QGroupBox(self)
        buttom_layout = QHBoxLayout()
        buttom_grp.setLayout(buttom_layout)
        layout.addWidget(buttom_grp)

        button = QToolButton(top_grp)
        button.setText('swap')
        top_layout.addWidget(button)
        button.clicked.connect(self.on_click_swap)

        close = QToolButton(top_grp)
        close.setText('close')
        top_layout.addWidget(close)
        close.clicked.connect(app.quit)

        self.entry = QLineEdit(buttom_grp)
        self.entry.setText('left')
        buttom_layout.addWidget(self.entry)

        self.label = QLabel(buttom_grp)
        self.label.setText('right')
        buttom_layout.addWidget(self.label)

        GLib.unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGINT, \
                             self.handle_unix_signal, None)

    def handle_unix_signal(self, user_data):
        app.quit()

    def on_click_swap(self):
        label = self.label.text()
        self.label.setText(self.entry.text())
        self.entry.setText(label)

app = QApplication(list())
sample = Sample()

sample.show()
app.exec()

このプログラムを実行するために,⁠python3-pyqt5」パッケージをインストールしてください。プログラムを実行すると,Gtk+3を使ったサンプルと似たウィンドウが開きます。

$ sudo apt-get install python3-pyqt5
$ gedit qt5.py
$ chmod a+x qt5.py
$ ./qt5.py

利用した実装環は完全に異なりますが,レイアウトの決定,ウィジェットの配置,イベントループ,Unixシグナルの処理注2といった考え方は,Gtk+3と同じです。

注2
このプログラムでは,Unixシグナルの処理をするためにGLibを利用しています。Qt4/Qt5はそのイベントループ実装内で,GLibのイベントループも回すよう書かれているためです。これにより,GLibの実装を併用できます。その場合,Qt4/Qt5のビルドオプションでGLibサポートを有効にする必要があります(Ubuntuのパッケージはデフォルトで有効です⁠⁠。

今回のプログラムについて

今回掲載したプログラムのライセンスはすべてパブリックドメインです。

また,それぞれのプログラムが利用している実装に関心のある方は以下のリファレンスを参照してください。

著者プロフィール

坂本貴史(さかもとたかし)

Ubuntuのマルチメディア編集環境であるUbuntu Studioのユーザ。主にUbuntu日本コミュニティとUbuntu Studioコミュニティで活動。いつかユーザ同士で合作するのが夢。