Python PyQt
PyQt は、グラフィカルユーザーインターフェース(GUI)を作成するための強力な Python ライブラリで、Python 内蔵の Tkinter の代わりに使用できます。
PyQt は Qt フレームワークの Python バインディングであり、デスクトップアプリケーション開発に広く利用されています。
Qt は、クロスプラットフォームの C++ アプリケーション開発フレームワークです。
PyQt を使用すると、Python 開発者は Qt ライブラリを活用して、強力な GUI アプリケーションを作成できます。
PyQt には以下の主要なバージョンがあります:
- PyQt4:Qt4 に基づくバインディング
- PyQt5:Qt5 に基づくバインディング
- PyQt6:Qt6 に基づくバインディング(最新版)
PyQt のインストール
pip を使用して PyQt5 をインストール:
# 安装PyQt5 pip install PyQt5 # 安装Qt设计师和其他工具(可选) pip install PyQt5-tools
最初の PyQt プログラム
シンプルなウィンドウを作成
以下は、最も基本的な PyQt プログラムで、空のウィンドウを作成します:
例
# アプリケーションインスタンスを作成
app = QApplication([])
# メインウィンドウを作成
window = QWidget()
window.setWindowTitle("私の最初の PyQt プログラム")
window.setGeometry(100, 100, 400, 300) # (x, y, width, height)
# ウィンドウを表示
window.show()
# アプリケーションを実行
app.exec_()

コードの解説
QApplication:GUI アプリケーションの制御フローと主要設定を管理します。QWidget:最も基本的なウィンドウクラスであり、すべての UI コンポーネントはこれから継承されます。setWindowTitle():ウィンドウのタイトルを設定します。setGeometry():ウィンドウの位置とサイズを設定します。show():ウィンドウを表示します。app.exec_():イベントループを開始し、ユーザーの操作を待ちます。
典型的な PyQt アプリケーションは、以下の要素で構成されています:
- QApplication オブジェクト:すべての PyQt アプリケーションには QApplication インスタンスが必要です
- ウィンドウとコントロール:ユーザーインターフェースコンポーネント
- イベントループ:ユーザー入力とシステムイベントを処理するループ
- イベントハンドラー:イベントに応答する関数またはメソッド
例
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# ウィンドウのタイトルとサイズを設定
self.setWindowTitle("私の最初のPyQtアプリ")
self.setGeometry(100, 100, 400, 300) # x, y, width, height
# ボタンを作成
self.button = QPushButton("クリックして", self)
self.button.setGeometry(150, 150, 100, 30)
self.button.clicked.connect(self.button_clicked)
def button_clicked(self):
print("ボタンがクリックされました!")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

よく使う PyQt コンポーネント
ボタン(QPushButton)
例
button = QPushButton("クリックして", window)
button.move(150, 150) # ボタンの位置を設定
ラベル(QLabel)
例
label = QLabel("Hello PyQt!", window)
label.move(100, 100)
テキストボックス(QLineEdit)
例
textbox = QLineEdit(window)
textbox.move(100, 50)
その他のよく使うコンポーネントの詳細は以下を参照:https://www.example.com/python3/python-pyqt-widgets.html
レイアウト管理(QVBoxLayout)
レイアウトマネージャーを使用すると、コンポーネントの位置を自動的に調整できます:
例
layout = QVBoxLayout()
layout.addWidget(QLabel("ユーザー名"))
layout.addWidget(QLineEdit())
layout.addWidget(QPushButton("ログイン"))
window.setLayout(layout)
レイアウト管理の詳細は以下を参照:https://www.example.com/python3/python-pyqt-layout.html
シグナルとスロットの仕組み
PyQt はシグナル(Signal)とスロット(Slot)のメカニズムでイベントを処理します。
PyQt のシグナルとスロットの仕組みは、オブジェクト間の通信に使用される中核的なメカニズムです。
- シグナル(Signal): 特定のイベントが発生したときに発信される通知
- スロット(Slot): シグナルに応答する関数またはメソッド
例
def on_button_click():
print("ボタンがクリックされました!")
button = QPushButton("クリックして", window)
button.clicked.connect(on_button_click) # シグナルとスロットを接続
カスタムシグナル
例
class MyEmitter(QObject):
my_signal = pyqtSignal(str) # シグナルを定義
emitter = MyEmitter()
emitter.my_signal.connect(lambda x: print(f"シグナルを受信: {x}"))
emitter.my_signal.emit("Hello") # シグナルを発火
レイアウト管理の詳細は以下を参照:https://www.example.com/python3/python-pyqt-signals-and-slots.html
Qt Designer を使用する
Qt Designer はビジュアルデザインツールで、コンポーネントをドラッグ&ドロップしてインターフェースをデザインできます:
- Designer を起動します(通常は Python インストールディレクトリの Lib\site-packages\qt5_applications\Qt\bin にあります)
- インターフェースをデザインして.uiファイルとして保存
将 .uiファイルを Python コードに変換します:
pyuic5 input.ui -o output.py
生成されたインターフェースをコードで使用します:
例
# UIファイルをロード
Form, Window = uic.loadUiType("output.ui")
# UIを使用
app = QApplication(sys.argv)
window = Window()
form = Form()
form.setupUi(window)
window.show()
sys.exit(app.exec_())
実践:シンプルなメモ帳アプリ
インターフェース設計
例
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit,
QAction, QFileDialog, QMessageBox)
class Notepad(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.text_edit = QTextEdit(self)
self.setCentralWidget(self.text_edit)
self.create_actions()
self.create_menus()
self.setWindowTitle('簡易メモ帳')
self.setGeometry(100, 100, 800, 600)
def create_actions(self):
# ファイルメニューのアクション
self.new_action = QAction('新規作成', self)
self.new_action.setShortcut('Ctrl+N')
self.new_action.triggered.connect(self.new_file)
self.open_action = QAction('開く', self)
self.open_action.setShortcut('Ctrl+O')
self.open_action.triggered.connect(self.open_file)
self.save_action = QAction('保存', self)
self.save_action.setShortcut('Ctrl+S')
self.save_action.triggered.connect(self.save_file)
self.exit_action = QAction(終了, self)
self.exit_action.setShortcut('Ctrl+Q')
self.exit_action.triggered.connect(self.close)
# 編集メニューのアクション
self.copy_action = QAction('コピー', self)
self.copy_action.setShortcut('Ctrl+C')
self.copy_action.triggered.connect(self.text_edit.copy)
self.paste_action = QAction('貼り付け', self)
self.paste_action.setShortcut('Ctrl+V')
self.paste_action.triggered.connect(self.text_edit.paste)
self.cut_action = QAction('切り取り', self)
self.cut_action.setShortcut('Ctrl+X')
self.cut_action.triggered.connect(self.text_edit.cut)
def create_menus(self):
menubar = self.menuBar()
# ファイルメニュー
file_menu = menubar.addMenu('ファイル')
file_menu.addAction(self.new_action)
file_menu.addAction(self.open_action)
file_menu.addAction(self.save_action)
file_menu.addSeparator()
file_menu.addAction(self.exit_action)
# 編集メニュー
edit_menu = menubar.addMenu('編集')
edit_menu.addAction(self.copy_action)
edit_menu.addAction(self.paste_action)
edit_menu.addAction(self.cut_action)
def new_file(self):
self.text_edit.clear()
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, 'ファイルを開く')
if filename:
try:
with open(filename, 'r') as f:
self.text_edit.setText(f.read())
except Exception as e:
QMessageBox.warning(self, 'エラー', f'ファイルを開けません: {e}')
def save_file(self):
filename, _ = QFileDialog.getSaveFileName(self, 'ファイルを保存')
if filename:
try:
with open(filename, 'w') as f:
f.write(self.text_edit.toPlainText())
except Exception as e:
QMessageBox.warning(self, 'エラー', f'ファイルを保存できません: {e}')
if __name__ == '__main__':
app = QApplication(sys.argv)
notepad = Notepad()
notepad.show()
sys.exit(app.exec_())

PyQt5 の主要コンポーネント
ほとんどのコンポーネントは PyQt5.QtWidgets にあります。
高度な機能(マルチメディア、ネットワークなど)には、他のモジュール(QtCore、QtGui、QtNetwork など)が必要な場合があります。
QListView/QTableView/QTreeView は、データモデル(QStandardItemModel など)と組み合わせて使用する必要があり、柔軟性が高くなります。
その他のインストール拡張:
pip install PyQtWebEngine # 网页支持 pip install PyQtChart # 图表支持
| コンポーネントのカテゴリ | コンポーネント名 | モジュール | 説明 |
|---|---|---|---|
| 基本ウィンドウコンポーネント | QWidget | QtWidgets | すべてのユーザーインターフェースオブジェクトの基底クラスで、空のウィンドウやコンテナとして使用できます。 |
QMainWindow | QtWidgets | メインウィンドウのフレームで、メニューバー、ツールバー、ステータスバーなどを含みます。 | |
QDialog | QtWidgets | ダイアログの基底クラスで、ポップアップウィンドウに使用します。 | |
| レイアウト管理 | QVBoxLayout | QtWidgets | 垂直レイアウトマネージャー |
QHBoxLayout | QtWidgets | 水平レイアウトマネージャー | |
QGridLayout | QtWidgets | グリッドレイアウトマネージャー | |
QFormLayout | QtWidgets | フォームレイアウトマネージャー(ラベル+入力ボックスのペア) | |
| ボタンクラス | QPushButton | QtWidgets | 通常のボタン |
QRadioButton | QtWidgets | ラジオボタン | |
QCheckBox | QtWidgets | チェックボックス | |
QToolButton | QtWidgets | ツールバーボタン(アイコン付きにできます) | |
| 入力コントロール | QLineEdit | QtWidgets | 単一行テキスト入力ボックス |
QTextEdit | QtWidgets | 複数行リッチテキストエディター(HTML対応) | |
QPlainTextEdit | QtWidgets | 複数行プレーンテキストエディター | |
QSpinBox | QtWidgets | 数値調整ボックス(整数) | |
QDoubleSpinBox | QtWidgets | 数値調整ボックス(浮動小数点数) | |
QComboBox | QtWidgets | ドロップダウン選択ボックス | |
QDateEdit | QtWidgets | 日付選択ボックス | |
QTimeEdit | QtWidgets | 時刻選択ボックス | |
QDateTimeEdit | QtWidgets | 日時選択ボックス | |
QSlider | QtWidgets | スライダー(水平/垂直) | |
QDial | QtWidgets | 円形ダイヤルコントロール | |
| 表示コントロール | QLabel | QtWidgets | テキスト/画像ラベル |
QLCDNumber | QtWidgets | LCDデジタルディスプレイ | |
QProgressBar | QtWidgets | プログレスバー | |
QStatusBar | QtWidgets | ステータスバー(通常はQMainWindow) | |
| コンテナクラス | QGroupBox | QtWidgets | グループボックス(タイトル付きコンテナ) |
QTabWidget | QtWidgets | タブコンテナ | |
QStackedWidget | QtWidgets | スタックコンテナ(一度に1つの子コントロールを表示) | |
QScrollArea | QtWidgets | スクロールエリアコンテナ | |
QMdiArea | QtWidgets | MDI(マルチドキュメントインターフェース)エリア | |
| リスト/テーブル/ツリー | QListWidget | QtWidgets | リストコントロール(アイテム管理を含む) |
QTreeWidget | QtWidgets | ツリーコントロール | |
QTableWidget | QtWidgets | テーブルコントロール | |
QListView | QtWidgets | リストビュー(データモデルと組み合わせる必要があります) | |
QTableView | QtWidgets | テーブルビュー(データモデルと組み合わせる必要があります) | |
QTreeView | QtWidgets | ツリービュー(データモデルと組み合わせる必要があります) | |
| メニュー/ツールバー | QMenuBar | QtWidgets | メニューバー |
QMenu | QtWidgets | メニュー(サブメニューとアクションを含むことができます) | |
QToolBar | QtWidgets | ツールバー | |
QAction | QtWidgets | アクション(メニュー項目、ツールバーボタンなどに使用) | |
| ダイアログ | QFileDialog | QtWidgets | ファイル選択ダイアログ |
QColorDialog | QtWidgets | 色選択ダイアログ | |
QFontDialog | QtWidgets | フォント選択ダイアログ | |
QInputDialog | QtWidgets | 入力ダイアログ(テキスト、数値など) | |
QMessageBox | QtWidgets | メッセージボックス(警告、エラー、確認など) | |
| グラフィックスビュー | QGraphicsView | QtWidgets | グラフィックスビューフレームワーク(2Dグラフィックス用) |
QGraphicsScene | QtWidgets | グラフィックスシーン(組み合わせてQGraphicsView使用) | |
| その他の機能コンポーネント | QCalendarWidget | QtWidgets | カレンダーウィジェット |
QSplashScreen | QtWidgets | スプラッシュスクリーン | |
QSystemTrayIcon | QtWidgets | システムトレイアイコン | |
QWebEngineView | QtWebEngineWidgets | ウェブブラウザコンポーネント(別途インストールが必要PyQtWebEngine) |