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 プログラムで、空のウィンドウを作成します:

例

from PyQt5.QtWidgets import QApplication, QWidget

# アプリケーションインスタンスを作成
app = QApplication([])

# メインウィンドウを作成
window = QWidget()
window.setWindowTitle("私の最初の PyQt プログラム")
window.setGeometry(100, 100, 400, 300)  # (x, y, width, height)

# ウィンドウを表示
window.show()

# アプリケーションを実行
app.exec_()

コードの解説

  1. QApplication:GUI アプリケーションの制御フローと主要設定を管理します。
  2. QWidget:最も基本的なウィンドウクラスであり、すべての UI コンポーネントはこれから継承されます。
  3. setWindowTitle():ウィンドウのタイトルを設定します。
  4. setGeometry():ウィンドウの位置とサイズを設定します。
  5. show():ウィンドウを表示します。
  6. app.exec_():イベントループを開始し、ユーザーの操作を待ちます。

典型的な PyQt アプリケーションは、以下の要素で構成されています:

  1. QApplication オブジェクト:すべての PyQt アプリケーションには QApplication インスタンスが必要です
  2. ウィンドウとコントロール:ユーザーインターフェースコンポーネント
  3. イベントループ:ユーザー入力とシステムイベントを処理するループ
  4. イベントハンドラー:イベントに応答する関数またはメソッド

例

import sys
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)

例

from PyQt5.QtWidgets import QPushButton

button = QPushButton("クリックして", window)
button.move(150, 150)  # ボタンの位置を設定

ラベル(QLabel)

例

from PyQt5.QtWidgets import QLabel

label = QLabel("Hello PyQt!", window)
label.move(100, 100)

テキストボックス(QLineEdit)

例

from PyQt5.QtWidgets import QLineEdit

textbox = QLineEdit(window)
textbox.move(100, 50)

その他のよく使うコンポーネントの詳細は以下を参照:https://www.example.com/python3/python-pyqt-widgets.html


レイアウト管理(QVBoxLayout)

レイアウトマネージャーを使用すると、コンポーネントの位置を自動的に調整できます:

例

from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton

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): シグナルに応答する関数またはメソッド

例

from PyQt5.QtWidgets import QPushButton

def on_button_click():
    print("ボタンがクリックされました!")

button = QPushButton("クリックして", window)
button.clicked.connect(on_button_click)  # シグナルとスロットを接続

カスタムシグナル

例

from PyQt5.QtCore import pyqtSignal, QObject

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

生成されたインターフェースをコードで使用します:

例

from PyQt5 import uic

# 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_())

実践:シンプルなメモ帳アプリ

インターフェース設計

例

import sys
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      # 图表支持
コンポーネントのカテゴリコンポーネント名モジュール説明
基本ウィンドウコンポーネントQWidgetQtWidgetsすべてのユーザーインターフェースオブジェクトの基底クラスで、空のウィンドウやコンテナとして使用できます。
QMainWindowQtWidgetsメインウィンドウのフレームで、メニューバー、ツールバー、ステータスバーなどを含みます。
QDialogQtWidgetsダイアログの基底クラスで、ポップアップウィンドウに使用します。
レイアウト管理QVBoxLayoutQtWidgets垂直レイアウトマネージャー
QHBoxLayoutQtWidgets水平レイアウトマネージャー
QGridLayoutQtWidgetsグリッドレイアウトマネージャー
QFormLayoutQtWidgetsフォームレイアウトマネージャー(ラベル+入力ボックスのペア)
ボタンクラスQPushButtonQtWidgets通常のボタン
QRadioButtonQtWidgetsラジオボタン
QCheckBoxQtWidgetsチェックボックス
QToolButtonQtWidgetsツールバーボタン(アイコン付きにできます)
入力コントロールQLineEditQtWidgets単一行テキスト入力ボックス
QTextEditQtWidgets複数行リッチテキストエディター(HTML対応)
QPlainTextEditQtWidgets複数行プレーンテキストエディター
QSpinBoxQtWidgets数値調整ボックス(整数)
QDoubleSpinBoxQtWidgets数値調整ボックス(浮動小数点数)
QComboBoxQtWidgetsドロップダウン選択ボックス
QDateEditQtWidgets日付選択ボックス
QTimeEditQtWidgets時刻選択ボックス
QDateTimeEditQtWidgets日時選択ボックス
QSliderQtWidgetsスライダー(水平/垂直)
QDialQtWidgets円形ダイヤルコントロール
表示コントロールQLabelQtWidgetsテキスト/画像ラベル
QLCDNumberQtWidgetsLCDデジタルディスプレイ
QProgressBarQtWidgetsプログレスバー
QStatusBarQtWidgetsステータスバー(通常はQMainWindow)
コンテナクラスQGroupBoxQtWidgetsグループボックス(タイトル付きコンテナ)
QTabWidgetQtWidgetsタブコンテナ
QStackedWidgetQtWidgetsスタックコンテナ(一度に1つの子コントロールを表示)
QScrollAreaQtWidgetsスクロールエリアコンテナ
QMdiAreaQtWidgetsMDI(マルチドキュメントインターフェース)エリア
リスト/テーブル/ツリーQListWidgetQtWidgetsリストコントロール(アイテム管理を含む)
QTreeWidgetQtWidgetsツリーコントロール
QTableWidgetQtWidgetsテーブルコントロール
QListViewQtWidgetsリストビュー(データモデルと組み合わせる必要があります)
QTableViewQtWidgetsテーブルビュー(データモデルと組み合わせる必要があります)
QTreeViewQtWidgetsツリービュー(データモデルと組み合わせる必要があります)
メニュー/ツールバーQMenuBarQtWidgetsメニューバー
QMenuQtWidgetsメニュー(サブメニューとアクションを含むことができます)
QToolBarQtWidgetsツールバー
QActionQtWidgetsアクション(メニュー項目、ツールバーボタンなどに使用)
ダイアログQFileDialogQtWidgetsファイル選択ダイアログ
QColorDialogQtWidgets色選択ダイアログ
QFontDialogQtWidgetsフォント選択ダイアログ
QInputDialogQtWidgets入力ダイアログ(テキスト、数値など)
QMessageBoxQtWidgetsメッセージボックス(警告、エラー、確認など)
グラフィックスビューQGraphicsViewQtWidgetsグラフィックスビューフレームワーク(2Dグラフィックス用)
QGraphicsSceneQtWidgetsグラフィックスシーン(組み合わせてQGraphicsView使用)
その他の機能コンポーネントQCalendarWidgetQtWidgetsカレンダーウィジェット
QSplashScreenQtWidgetsスプラッシュスクリーン
QSystemTrayIconQtWidgetsシステムトレイアイコン
QWebEngineViewQtWebEngineWidgetsウェブブラウザコンポーネント(別途インストールが必要PyQtWebEngine)

学習リソース

その他の拡張