Pyqt5 に基づいてアプリケーションを迅速に構築するための詳細なチュートリアル

1. はじめに

        GUI として知られるグラフィカル ユーザー インターフェイスは、今日のほとんどのパーソナル コンピューターの機能です。さまざまなコンピューティング スキル レベルのユーザーに直感的なエクスペリエンスを提供します。GUI アプリケーションはより多くのリソースを使用する可能性がありますが、ポイント アンド クリックの性質により一般にユーザー フレンドリーです。

        PyQt は、Python でクロスプラットフォーム GUI アプリケーションを開発するために利用できるツールキットの 1 つです。この言語をすでにしっかりと理解している場合、この言語は強力であり、習得も簡単です。

        この記事では、PyQt を使用して GUI を構築する基本を紹介します。Python とオブジェクト指向プログラミングの基本的な知識が必要です。Python の概念を説明するのではなく、主に PyQt に焦点を当てます。この記事の最後には、

pyqt5 + GDAL リモート センシング インデックス (モデル) に基づいた、誰もが学習できるインターフェイスを備えた小さなソフトウェア リソース。

2.PyQtとは何ですか

        PyQt は、クロスプラットフォーム アプリケーション開発フレームワーク Qt の Python バインディングです。PyQt を使用すると、Python のようなシンプルかつ強力な言語で GUI アプリケーションを開発できるという利点があります。Qt API のすべての機能を公開します。

        この記事では PyQt5 を使用します。Python v3.5 以降が必要ですが、以前のバージョンの Python でビルドすることもできます。 

3.PyQtをインストールする

        PyQt の商用ライセンス版の場合は、インストールする前にライセンスを取得する必要があります。GPL ライセンス バージョンをインストールするには、次のコマンドを実行して仮想環境を作成し、PyQt5 をインストールします。PyQt はグローバルにインストールできますが、仮想環境を使用することをお勧めします。

# Create virtual environment
python3 -m venv env

# Activate virtual environment
source env/bin/activate

# Install PyQt5
pip install PyQt5

        詳しいインストール手順については、使用している特定の PyQt バージョンのドキュメントを確認してください。ここには、GPL バージョンと商用バージョンをインストールするための手順が含まれています。このドキュメントには、特定のエラーが発生した場合のトラブルシューティングのヒントも記載されています。

4、PyQt は簡単な GUI プログラムの構築を開始します

        単純な「hello world」GUI を構築して、PyQt を試してみましょう。このシンプルなアプリを構築すると、次の部分の作業がはるかに簡単になります。

        始める前に、PyQt はキャメルケースとプロパティ名を使用することをここで言及しておく価値があります。この記事では、一貫性を保つために、変数や関数に名前を付けるときに、Python で推奨されている命名規則ではなく、キャメルケースを使用します。

        今のところは、意図的にシンプルかつ最小限に留めていきます。プロジェクト ディレクトリに app.py ファイルを作成したと仮定します。次の手順に従って、各ステップのコード行を app.py ファイルに追加できます。

4.1 必要なクラスをインポートする

         PyQt にはいくつかの組み込みモジュールが付属しています。ただし、GUI を構築する場合、最も頻繁に操作するモジュールは QtWidgets モジュールです。GUI の作成に使用するクラスが含まれています。

        私たちの目標は最も基本的な「hello world」GUI を作成することなので、QApplication クラスと QWidgets クラスのみを使用します。まず次のようにインポートします。

from PyQt.QtWidgets import QApplication, QWidgets

        同様の方法で、他のクラスをインポートしてアプリケーションで使用することができます。

4.2 アプリケーションの初期化

        QApplication のインスタンスを作成してアプリケーションを初期化する必要があります。アプリケーションの主な設定と制御フローの管理を担当します。したがって、ユーザー インターフェイスに関連する他のオブジェクトを作成する前に、このクラスをインスタンス化する必要があります。

application = QApplication([])

        QApplication クラスの役割について詳しくは、Qt のドキュメントを参照してください。

        上記のコードでは空の配列を QApplication に渡しましたが、アプリケーションがコマンド ラインから引数を受け取るようにしたい場合は、sys.argv を渡すこともできます。sys.argv を引数として渡す場合は、必ず sys をインポートしてください。

4.3 メインウィンドウの作成

        メイン ウィンドウはトップレベル ウィンドウとも呼ばれ、親ウィンドウを持たないウィジェットです。すべての GUI にはメイン ウィンドウが必要です。

        ここで、次のように QWidget インスタンスを作成し、それをメイン ウィンドウにします。

mainWindow = QWidget()
mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Hello World')

        Qwidget インスタンスを作成した後、他のいくつかのメソッドを呼び出すことができます。単純な GUI では、setGeometry メソッドと setWindowTitle メソッドを呼び出します。

        setGeometry メソッドは、画面上で GUI を配置し、その寸法を設定するために使用されます。その関数シグネチャは setGeometry(x, y, width, height) です。最初の 2 つのパラメータは、画面上のウィンドウの x 座標と y 座標を指定し、width と height はそれぞれウィンドウの幅と高さを設定するために使用されます。

        setWindowTitle メソッドは、名前が示すように、アプリケーションのタイトルを設定するために使用されます。タイトルを文字列パラメータとして渡すことができます。自分で設定しない場合、ウィンドウにはタイトルがありません。

4.4 メインウィンドウを表示する

        前の手順で作成したウィンドウは、デフォルトでは非表示になっています。show メソッドを呼び出して表示する必要があります。

mainWindow.show()

4.5 イベントループの開始

        最後に、application.exec メソッドを呼び出してイベント ループを開始する必要があります。

application.exec()

        代わりに application.exec_() を使用してイベント ループを開始することもできます。上記の 5 つの手順をすべて完了すると、app.py ファイルに次のコードが含まれるはずです。

from PyQt5.QtWidgets import QWidget, QApplication

application = QApplication([])

mainWindow = QWidget()

mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Hello World')

mainWindow.show()

application.exec()

        他の Python スクリプトと同様に、コマンド python3 app.py を使用して app.py を実行する必要があります。ウィンドウが表示されているのが確認できるはずです。ウィンドウの外観はシステムによって大きく異なります。Linux では、以下の画像のように表示されるはずです。

 5、PyQt の主な概念

        最初の「hello world」GUI を作成しました。ここで、PyQt についての理解を広げるいくつかの主要な概念を見てみましょう。実稼働グレードの GUI を構築するには、これらの概念をある程度理解している必要があります。

5.1 ウィジェット

        ほとんどの GUI ツールキットと同様、ウィジェットは PyQt GUI の構成要素です。ウィジェットを使用して、データを表示したり、ユーザー入力を受信したり、他の関連ウィジェットをグループ化するコンテナとして使用したりできます。

        ほとんどのウィジェットは他のウィジェット内にネストされていますが、親のないウィジェットが常に存在します。前述したように、親のないウィジェットはウィンドウと呼ばれます。

        PyQt でウィジェットを作成するための主要なクラスは、QWidgets クラスです。PyQt で UI を作成するためのすべての要素は、QWidgets クラスのサブクラスであるか、QWidgets クラスと組み合わせて使用​​されます。

        一部のウィジェット クラスについては、PyQt または Qt のドキュメントで読むことができます。ここにすべてをリストすることはできません。基本的なウィジェット クラスには次のものがあります。

  • QLabel はテキストと画像を表示するために使用されます
  • QPushButton はコマンド ボタンの作成に使用されます
  • QLineEdit は単一行のテキスト エディタを作成するために使用されます。
  • QRadioButton は、テキスト ラベル付きのラジオ ボタンを作成するために使用されます。

        単純なプッシュボタン ウィジェットを「hello world」GUI に追加してみましょう。

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton

application = QApplication([])

mainWindow = QWidget()
mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Button Widget')

pushButton = QPushButton(parent=mainWindow, text='Click me')

mainWindow.show()
application.exec()

        上記のコードを実行すると、下の画像のようなウィンドウが作成されます。

 5.2 イベントループ

        ほとんどの GUI ツールキットはイベント駆動型です。PyQt も例外ではありません。イベントは、ボタンをクリックする、入力テキストを入力する、リンクをクリックする、ウィンドウを閉じるなど、アプリケーションとのユーザー操作から発生することがあります。イベントは、ウィンドウ システムまたは他のソースから取得されることもあります。イベント ループは、これらのイベントの管理を担当します。

        「hello world」GUI を構築するときに強調したように、.exec メソッドを呼び出すとイベント ループがトリガーされます。ループはイベントが発生するのを待ち、イベントが発生すると応答します。Terminate イベントを受信すると、アプリケーションを終了して終了します。

        このイベント応答機能を通じて、シグナルとスロットを使用して GUI に対話性を追加できます。次のセクションでは、シグナルとスロットについて学習します。

5.3 信号とスロット

        前のセクションでは、ウィジェットを使用して GUI の表示コンポーネントを作成する方法を説明しました。シグナルとスロットを通じて GUI に対話性を追加できます。「hello world」GUI にボタン ウィジェットを追加しましたが、現在ボタンをクリックしても何も起こりません。

                通常、ボタンをクリックすると、別のウィジェットを開く、ウィジェットを閉じる、ログインなどのアクションがトリガーされます。このようなユーザーのアクションやウィジェットの状態の変化に応答するには、シグナルとスロットが必要です。

シグナルは、何かが発生したときにウィジェットが送信する通知です。ボタンをクリックしたり、マウスを動かしたり、テキスト入力フィールドを変更したりすることが考えられます。ウィジェットが異なれば、異なる信号が発せられます。たとえば、ボタン ウィジェットは、クリックされるとクリック信号を発します。ボタン ウィジェットは、押す、離す、トグル信号など、その他のあまり知られていない信号も送信します。特定のウィジェットによって発行されるシグナルを理解するには、ウィジェットの対応するクラスのドキュメントを読む必要があります。

        スロットは、ウィジェットが特定の信号を発行した後に呼び出される関数またはメソッドです。いくつかのウィジェットには事前定義されたスロットが付属しています。ただし、対象の信号を処理するスロットを定義することもできます。

        これまで学んだことを説明するために、ボタン ウィジェットにスロットを追加して、クリック信号に応答して実行できるようにしてみましょう。

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton

application = QApplication([])

mainWindow = QWidget()
mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Slot and Signal')

def clickedSlot():
    print('The button has been clicked')

pushButton = QPushButton(parent=mainWindow, text='Click me')
pushButton.clicked.connect(clickedSlot)

mainWindow.show()
application.exec()

        上記のコードを実行してボタンをクリックすると、ターミナルに「ボタンがクリックされました」というテキストが表示されるはずです。

5.4 PyQT レイアウト管理

        これまでは、PyQt の最も基本的なコンポーネントのみを見てきました。実際のアプリケーションでは、同じウィンドウ内で複数のウィジェットを操作することになります。幸いなことに、Qt にはアプリケーション UI のウィジェットのレイアウトを管理するためのさまざまな機能があります。これらの関数を使用して、ウィジェットの配置方法を記述することができます。スペースが変更されるたびに、レイアウトによりウィジェットのサイズと位置が自動的に調整されます。したがって、UI は引き続き使用できます。

        PyQt にはさまざまなレイアウト スタイルがありますが、この記事では水平、垂直、グリッド、フォーム レイアウトについて説明します。その他の内容については、PyQt または Qt ドキュメントを参照してください。前述の各レイアウトには、対応する組み込みレイアウト クラスがあります。これらのクラスは次のとおりです。

  • QHBoxLayout
  • QVBoxLayout
  • QGridLayout
  • QFormLayout

(1) 横型レイアウト

        組み込みの QHBoxLayout クラスを使用して、ウィジェットを水平方向 (通常は左から右) にレイアウトできます。右から左に記述する言語の場合は、ウィジェットを右から左に配置することもできます。

        以下のコードでは、「hello world」GUI を変更して、5 つの画像を水平レイアウトで表示します。繰り返しを避けるために、for ループを使用して画像をレイアウトに追加します。このコードを実行する前に、cat.jpg ファイルに画像があることを確認してください。

from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (
    QLabel,
    QWidget,
    QApplication,
    QHBoxLayout,
)

application = QApplication([])

mainWindow = QWidget()

mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Horizontal Layout')

horizontalLayout = QHBoxLayout()

for num in range(6):
    label = QLabel()
    pixmap = QPixmap('cat.jpg')
    label.setPixmap(pixmap)
    horizontalLayout.addWidget(label)

mainWindow.setLayout(horizontalLayout)
mainWindow.show()

application.exec()

        PyQt では、QLabel ウィジェットを使用して画像をレンダリングできます。QtGui モジュールから QPixmap クラスのインスタンスをインポートした後、まずそれを作成します。上記の for ループに示すように、QLabel クラスの setPixmap メソッドを使用してラベル ウィジェットに設定されます。

        次のセクションに進む前に、コードを少しいじってみることができます。画像をレイアウトする代わりに、ボタンなどの他のウィジェットをレイアウトできます。

        上記のコードにより、以下の画像のような GUI が作成されるはずです。

 (2) 縦型レイアウト

        ウィジェットを左から右または右から左に水平に配置する QHBoxLayout クラスとは異なり、QVBoxLayout クラスはウィジェットを上から下に垂直に配置します。

        以下のコードは、垂直レイアウト管理に QVBoxLayout クラスを使用する方法を示しています。これは水平レイアウトと非常によく似ています。

mainWindow = QWidget()

mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Vertical Layout')

verticalLayout = QVBoxLayout()

for num in range(6):
    label = QLabel()
    pixmap = QPixmap('cat.jpg')
    label.setPixmap(pixmap)
    verticalLayout.addWidget(label)

mainWindow.setLayout(verticalLayout)
mainWindow.show()

application.exec()

        上記のコードを実行すると、以下の画像のような画像が上から下に配置された GUI が作成されます。

 (3) グリッドレイアウト

        グリッド レイアウト管理には、2 次元グリッド内にウィジェットを配置することが含まれます。QGridLayout は、これを行うための便利な組み込みクラスです。グリッド レイアウトでは、項目が 2 つのグリッドを占有することができます。グリッド項目内に別のレイアウトをネストすることもできます。これにより、より複雑な GUI の構築がはるかに簡単になります。

        QGridLayout クラスのインスタンスを作成し、addWidget メソッドを使用してそれにウィジェットを追加できます。前のセクションと同様に、以下のコードの重複を避けるために、グリッドへの画像の追加をループします。グリッドをウィジェットで埋めるときにグリッドをスキップすることもできます。

from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (
    QLabel,
    QWidget,
    QApplication,
    QGridLayout,
)

application = QApplication([])

mainWindow = QWidget()

mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Grid Layout')

gridLayout = QGridLayout()

for row in range(3):
    for col in range(3):
        label = QLabel()
        pixmap = QPixmap('cat.jpg')
        label.setPixmap(pixmap)
        gridLayout.addWidget(label, row, col)

mainWindow.setLayout(gridLayout)
mainWindow.show()

application.exec()

        ウィジェットを 2 次元グリッドに配置しているため、レイアウトに追加するときに各ウィジェットの位置を指定する必要があります。

        上記のコードを実行すると、「hello world」GUI は以下の画像のようになります。

 (4) 帳票レイアウト

        フォーム レイアウトは主に、入力ウィジェットとそれに関連付けられたラベルを管理するために使用されます。これは、ラベル フィールドのペアに配置されたウィジェットの行で構成されます。以下のコードに示すように、フォーム レイアウトにウィジェットを配置するには、QFormLayout クラスを使用する必要があります。

from PyQt5.QtWidgets import (
    QGroupBox,
    QLabel,
    QLineEdit,
    QPlainTextEdit,
    QRadioButton,
    QSpinBox,
    QVBoxLayout,
    QWidget,
    QApplication,
    QFormLayout,
)

application = QApplication([])

mainWindow = QWidget()

mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Form Layout')

formLayout = QFormLayout()

nameLabel = QLabel('Name')
nameField = QLineEdit()

ageLabel = QLabel('Age')
ageField = QSpinBox()
ageField.setMinimum(0)
ageField.setMaximum(130)


sexLabel = QLabel('Sex')
sexGroup = QGroupBox()
verticalLayout = QVBoxLayout()

for sex in ['Male', 'Female', 'Other']:
    radioButton = QRadioButton(sex)
    verticalLayout.addWidget(radioButton)

sexGroup.setLayout(verticalLayout)

commentLabel = QLabel('Comments')
commentField = QPlainTextEdit()


formLayout.addRow(nameLabel, nameField)
formLayout.addRow(ageLabel, ageField)
formLayout.addRow(sexLabel, sexGroup)
formLayout.addRow(commentLabel, commentField)

mainWindow.setLayout(formLayout)
mainWindow.show()

application.exec()

        上記のコードを実行すると、次の図のような GUI が表示されます。ウィジェットに対してラベル フィールドが表示されます。各行にはラベル ウィジェットと、右側に対応するフィールド ウィジェットがあります。

         PyQt または Qt ドキュメントの他の形式のレイアウトについて読むことができます。

6. メニューバーを作成する

        メニューは、ほとんどの GUI アプリケーションの機能です。デスクトップ GUI には通常、メイン ウィンドウの上部にメニューがあります。一部のドロップダウン メニューには、ホバーすると開くサブメニューがあります。以下の画像は、デスクトップ GUI での一般的なメニューがどのように見えるかを示しています。

 

        前のセクションで説明したように、QMainWindow クラスは、すぐに使えるメニュー バーを GUI に追加するレイアウトを提供します。メニュー バーを作成するには、menuBar メソッドを使用する必要があります。

        以下は、上の画像にドロップダウン メニューを作成するコードです。QAction クラスを使用してアクションを作成し、対応するメニューに追加してドロップダウン メニューを作成します。

from PyQt5.QtWidgets import QMainWindow, QApplication, QAction

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle('Dropdown Menu')
        self.setGeometry(0, 0, 350, 400)
        self.addMenu()

    def addMenu(self):

        # Create menu bar
        menuBar = self.menuBar()

        # Add menu items
        fileMenu = menuBar.addMenu('File')
        helpMenu = menuBar.addMenu('Help')

        # Create actions

        visitWebsiteAction = QAction('Visit Our Website', self)
        fileBugReportAction = QAction('File a Bug Report', self)

        # Add dropdown menu items on the Help menu

        helpMenu.addAction(visitWebsiteAction)
        helpMenu.addAction(fileBugReportAction)

        # Add 'Follow Us' dropdown menu item on the Help menu

        followUs = helpMenu.addMenu('Follow Us')

        # Social media actions

        twitterAction = QAction('Twitter', self)
        githubAction = QAction('GitHub', self)

        # Add actions

        followUs.addAction(twitterAction)
        followUs.addAction(githubAction)



if (__name__ == '__main__'):
    application = QApplication([])
    mainWindow = MainWindow()
    mainWindow.show()
    application.exec()

7. ケース

        pyqt5 に基づくリモート センシング アプリケーション ソフトウェアは、ニーズに応じて変更できます。現時点ではNDVI指数計算のサンプルです。ロジックはインターフェイスから分離されているため、実行時にインターフェイスがスタックすることはありません。実行結果を下図に示します。

        リソースのアドレスは次のとおりです: https://download.csdn.net/download/u010329292/87708832 : 必要な友達はダウンロードして学ぶことができます~~

 

おすすめ

転載: blog.csdn.net/u010329292/article/details/130302941