[PyQtチュートリアル[BeYourself]

13179 ワード

この文章はPyQtシリーズの開発者Martin FitzpatrickのPyQtチュートリアルを参考に書いたものです.

0. Key Concepts


PyQtはQApplicationクラスを中心に動作する.
Qapplicationクラスはパラメータとして実行され、Qtイベントループを起動する役割を果たします.
Event Loopは、何が起こるかまでアプリケーションで動作し続けます.アプリケーション内のすべてのアクティビティ(カーソルを移動またはクリック)は、イベントHandler内部のイベントキューに記録されるイベントをトリガーします.
イベントハンドラは、イベントに関連する一連のプロセスを制御します.
各アプリケーションにはイベントループが1つしかありません.


1. Creating an Application


1.1 QApplication()


では、実際のコードでQLPplicationを介してイベントループを返しましょう.

# 애플리케이션당 QApplication instance는 단 하나만 존재한다.
# Command Line Argument를 사용하지 않을 것이라 판단되면, 빈 리스트를 파라미터로 집어넣어도 된다.
app = QApplication(sys.argv)

# 애플리케이션의 윈도우로 이용될 Qt Widget을 만든다.
# QWidget의 default는 hidden임이므로, 꼭 두 번째 줄을 추가해야 한다.
window = QWidget()
window.show()

# Event Loop을 시작한다.
app.exec()

# 애플리케이션은 Event Loop가 끝날 때까지 이 지점에 오지 못한다!

コードの作成に成功すると、次のウィンドウが表示されます.このウィンドウは、アプリケーションのスケルトンになるウィンドウです.

Qtでは、すべてのトップレベルのWidgetがwindowです.つまり、すべてのウィンドウに依存するWidgetはありません.したがって、任意のWidgetを使用してWindowを作成できます.

1.2 QMainWindow()


Qtでは、任意のwidgetがWindowであってもよい.したがって、前のコードを以下のように変更しても、正常に動作します.

import sys
from PyQt5.QtWidgets import QApplication, QPushButton

app = QApplication(sys.argv)

window = QPushButton("Push Me") # QWidget 대신에
window.show()

app.exec()
この論理によれば、PyQtは、Widget上にWidgetを積層し、1つの空のWindowから複数の機能を有する複雑なUIを構築することができる.
しかしながら、PyQtは、複数の標準構成要素を含むQMainWindowというソフトウェアパッケージを提供する.
現在、アプリケーションに特別な機能を追加するつもりはありませんので、このパッケージを直接使用することにしました.

実行後、先ほどと同じ外観のウィンドウが作成されました.
アプリケーションの実装にはより多くの機能が必要であり、ほとんどのQt WidgetはQtPy5.QtWidgetsからインポートできます.

2.Signals, Slots & Events

  • 信号は、Widgetが何かあったときに発する信号である.多くの信号は、クリック、カーソル移動など、ユーザーの動作に関係していますが、これはルールではありません.
  • Slotとは、信号を受信するためのSlotを意味し、Python内部の任意の機能または方法は、信号をslotに接続することができる.
  • 2.1 Connecting Widgets with Python Method


    では、信号とSlotの簡単な例として、QpushButton機能によりボタンを押して信号を送信するプログラムを実施する.
    まずは、「Clicked!メッセージを出力する関数を作成し、ボタンを押した信号に関連付けます.
    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("My App")
    
            button = QPushButton("Press Me!")
            button.setCheckable(True)
            button.clicked.connect(self.the_button_was_clicked)
    
            # Set the central widget of the Window.
            self.setCentralWidget(button)
    
        def the_button_was_clicked(self):
            print("Clicked!")
    
    
    app = QApplication(sys.argv)
    
    window = MainWindow()
    window.show()
    
    app.exec()
    

    Recieving Data


    次に、ボタンの状態を<押されたか押されていないか>の2つに設定し、ブールデータを送信してみます.
    アプリケーションでタイマーを作成するときに非常に役立つ機能であることに注意してください.整理します.
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("My App")
    
            button = QPushButton("Press Me!")
            button.setCheckable(True)
            button.clicked.connect(self.the_button_was_clicked)
            button.clicked.connect(self.the_button_was_toggled)
    
            self.setCentralWidget(button)
    
        def the_button_was_clicked(self):
            print("Clicked!")
    
        def the_button_was_toggled(self, checked):
            print("Checked?", checked)
    

    Storing Data


    多くの場合、現在のステータスを保存するのに役立ちます.
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.button_is_checked = True
    
            self.setWindowTitle("My App")
    
            button = QPushButton("Press Me!")
            button.setCheckable(True)
            button.clicked.connect(self.the_button_was_toggled)
            button.setChecked(self.button_is_checked)
    
            self.setCentralWidget(button)
    
        def the_button_was_toggled(self, checked):
            self.button_is_checked = checked
    
            print(self.button_is_checked)

    2.2 Connecting Widgets together Directly


    2.3 Events


    Qtアプリケーションにおけるユーザとのすべてのインタラクションはイベントである.Qtは多くのタイプでイベントを定義し,各イベントは異なる形式のインタラクションを表す.
    Qtは,イベントオブジェクトを用いて何が起こったかに関する情報をパッケージ化し,それを部品内のイベントHandlerに渡して処理する.