包括的PyQt5チュートリアル:PythonでプロフェッショナルGUIを構築
PyQtとは
PyQtは、QtフレームワークのPythonバインディングであり、Windows、macOS、Linux、Android、iOS、Raspberry PiなどでネイティブGUIアプリケーションを作成するためのクロスプラットフォームC++ライブラリです。バインディングはRiverbank Computing(英国)がメンテナンスし、Qt自体はThe Qt Company(フィンランド)が開発しています。PyQtによりPython開発者はQtの豊富なウィジェット、ネットワーキング、データベース、3D、マルチメディア機能にアクセスできます。
このチュートリアルでは以下を学びます:
- PyQt5の主要機能
- 利用可能なPyQtバージョン
- Windows、macOS、LinuxへのPyQt5インストール方法
- PyQtの基本概念とサンプルプログラム
- コアコンポーネントとウィジェット
- レイアウト戦略とテーマカスタマイズ
PyQt5の主要機能
PyQt5は600以上のクラスを公開し、以下をカバー:
- グラフィカルユーザーインターフェース
- SQLデータベース統合(SQLite、MySQL、PostgreSQL、Oracle、ODBC)
- QtWebEngineによるウェブレンダリング
- XMLパースと操作
- 堅牢なネットワーキング(TCP/UDP、SSL、DNS)
- マルチメディアと3Dグラフィックス(QtMultimedia、Qt3D)
これらの機能により、複雑で高性能なデスクトップおよび組み込みアプリケーションの構築が可能です。LG、メルセデス・ベンツ、AMD、パナソニック、ハーマンなどの大手企業がUIスタックにQtを採用しています。
PyQtバージョン
Riverbank Computingは2つの主要バインディングを提供:
- PyQt4 – Qt 4.xとQt 5.xモジュールをサポート(後方互換性なし)
- PyQt5 – Qt 5.x専用のバインディング
さらに、PyQt3DはQt3DフレームワークのPythonバインディングを提供し、リアルタイム3Dレンダリングとシミュレーションに有用です。
PyQt5のインストール
一般的な2つのインストール方法を説明。コンパイル済みC++バイナリを含み、長いビルドプロセスを回避できるホイールパッケージの使用を推奨します。
方法1:ホイール経由でインストール(推奨)
- お好みのターミナルまたはコマンドプロンプトを開く。
pip install PyQt5を実行してホイール(約50 MB)をダウンロード。- インストールが正常に完了したことを確認。
Windowsでの例:
pip install PyQt5
インストール後、PyQt5.QtWidgetsをインポートしてアプリケーション構築を開始できます。
方法2:ソースからビルド
ソースからのビルドはC++コードをコンパイルするためより複雑です。自分のプラットフォーム用のホイールが利用できない場合やカスタム変更が必要な場合のみ必要です。
PyQt5プログラミングの基礎
以下は「Guru99」とタイトルされた300×300のウィンドウを開く最小例。各行に注釈を付けています。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
w.show()
sys.exit(app.exec_())
解説:
QApplication– コアイベントループ。QWidget– すべてのUIコンポーネントの基底クラス。resize()– ウィンドウサイズを設定。setWindowTitle()– タイトルバーのテキストを定義。show()– ウィジェットを表示。app.exec_()– イベントループを開始し、ウィンドウが閉じるまでブロック。
インタラクティビティの追加
以下の例ではラベル、ボタン、ボタンクリック時に表示されるメッセージボックスを追加。シグナルとスロット、Qtのイベントシステムの核心を示します。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QMessageBox
def dialog():
mbox = QMessageBox()
mbox.setText("Your allegiance has been noted")
mbox.setDetailedText("You are now a disciple and subject of the all‑knowing Guru")
mbox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
mbox.exec_()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
w.setWindowTitle("Guru99")
label = QLabel("Behold the Guru, Guru99", w)
label.move(100, 130)
btn = QPushButton("Beheld", w)
btn.move(110, 150)
btn.clicked.connect(dialog)
w.show()
sys.exit(app.exec_())
ボタンクリックでdialog()がトリガーされ、モーダルなQMessageBoxが作成されます。
コアコンポーネントとウィジェット
PyQt5のアーキテクチャはいくつかのモジュールに整理されています。この階層を理解すると、必要なものだけをインポートできます。
モジュール概要
- Qt – すべてのサブモジュールを集約;小規模スクリプトに便利。
- QtCore – 非GUIコアクラス(シグナル、スロット、タイマー)。
- QtWidgets – 標準GUIウィジェット(ボタン、ラベル等)。
- QtGui – グラフィカルプリミティブと高度な描画。
- QtNetwork – TCP/UDPソケット、SSL、DNS。
- QtMultimedia – オーディオ/ビデオサポート。
- QtSql – データベース統合。
一般的なウィジェット
QLineEdit– 単一行テキスト入力。QRadioButton– 選択可能なラジオボタン。QComboBox– ドロップダウンセレクタ。QCheckBox– トグルボックス。QMenuBar– 水平メニューバー。QToolBar– ボタン付きツールバー。QTabWidget– タブインターフェース。QScrollBar– スクロールバーウィジェット。QSplitter– リサイズ可能な分割ビュー。QDockWidget– 着脱可能なドックパネル。
レイアウト管理
move()とresize()で手動配置する代わりに、Qtはウィンドウサイズに基づいてウィジェットを自動配置するレイアウトマネージャーを提供します。
ボックスレイアウト(HBox & VBox)
QHBoxLayoutはウィジェットを水平に、QVBoxLayoutは垂直に配置。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
app = QApplication([])
win = QWidget()
win.setWindowTitle("Musketeers")
btn1 = QPushButton("Athos")
btn2 = QPushButton("Porthos")
btn3 = QPushButton("Aramis")
hbox = QHBoxLayout(win)
hbox.addWidget(btn1)
hbox.addWidget(btn2)
hbox.addWidget(btn3)
win.show()
app.exec_()
QHBoxLayoutをQVBoxLayoutに置き換えるとボタンが垂直にスタックされます。
グリッドレイアウト
ウィジェットを2次元グリッドに配置。addWidget()メソッドは行・列インデックスとオプションの行・列スパンを受け取ります。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication([])
win = QWidget()
layout = QGridLayout(win)
for i in range(3):
for j in range(3):
layout.addWidget(QPushButton(f"Button {i},{j}"), i, j)
win.show()
app.exec_()
カスタムテーマとスタイル
PyQt5はネイティブテーマとカスタムスタイルシートをサポート。
ビルトインテーマ
app.setStyle("Fusion")や他の利用可能なスタイルでアプリケーションスタイルを設定。
app = QApplication([])
app.setStyle("Fusion")
パレットカスタマイズ
QPaletteを使ってウィジェットの色をプログラムで変更。
from PyQt5.QtGui import QPalette from PyQt5.QtCore import Qt palette = QPalette() palette.setColor(QPalette.ButtonText, Qt.black) palette.setColor(QPalette.Window, Qt.black) palette.setColor(QPalette.Button, Qt.gray) app.setPalette(palette)
Qtスタイルシート(CSSライク)
高度なスタイリングには、ウィジェットやアプリケーション全体にスタイルシートを直接適用。
btn.setStyleSheet("background-color: #4CAF50; color: white; padding: 5px;")
重要なポイント
- PyQt5はQtフレームワークの強力なPythonバインディングで、クロスプラットフォームなデスクトップ、組み込み、モバイルアプリに適する。
- インストールはホイール経由が最適;ソースビルドはオプション。
- コアモジュール:QtCore、QtGui、QtWidgets、QtNetwork、QtMultimedia、QtSql。
- ウィジェットにはボタン、ラベル、テキストフィールド、ラジオボタン、チェックボックス、メニュー、ツールバー、タブ、スプリッター、ドックが含まれる。
- インタラクティビティはQtのシグナルとスロット機構に依存。
- レイアウト(ボックスとグリッド)がウィジェット配置を自動化し、レスポンシブ性を向上。
- テーマはビルトインスタイル、パレット、Qtスタイルシートで実現可能。
- Qt DesignerとQt CreatorがUI設計とアプリパッケージングを効率化。
Python
- C#コレクション実践チュートリアル:実例で学ぶ柔軟なデータ管理
- Python print()関数の実践ガイド:基本から応用まで
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python format()文字列を明確な例でマスター
- Python String.find()メソッド完全ガイド:構文、例、代替手法
- Pythonラムダ関数をマスターする:実例とベストプラクティス
- Python round()関数を実例で徹底解説
- Python map()関数をマスター:構文、例、ベストプラクティス
- Python timeit():実行時間測定の実例付きガイド
- Python collections.Counter:効率的なカウント、更新、演算操作
- Python type()とisinstance()の理解:実例付き解説