Maya PySide2 / PySide チュートリアル 初学編 ⑤ – メインアプリケーションを作ろう

python,qt,PySide,PySide2,Tutorial

このチュートリアルはメインアプリケーションで使用するメニューとツールバー、ステータスバーについて学んでいきます

メニューとは、メニューバーに配置されたコマンド群のことで、ツールバーには、アプリケーションでよく使うコマンドのボタンがあります
ステータスバーは、ステータス情報を表示するためのウィジェット
20210820_02

import sys

try:
    from PySide2.QtWidgets import *
    from PySide2.QtCore import *
except ImportError:
    from PySide.QtGui import *
    from PySide.QtCore import *


class Example(QMainWindow):
    def __init__(self, parent=None, *args, **kwargs):
        super(Example, self).__init__(parent, *args, **kwargs)
        self.initUI()

    def initUI(self):
        self.setGeometry(500, 300, 400, 270)
        self.setWindowTitle("Menubar & ToolBar & Statusbar")

        openMenu = QMenu("Open")
        openMenu.addAction("help")

        exitAction = QAction("Exit", self)
        exitAction.setShortcut("Ctrl+G")
        exitAction.triggered.connect(self.close)

        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu("File")
        fileMenu.addMenu(openMenu)
        fileMenu.addAction(exitAction)

        self.toolbar = self.addToolBar("Exit")
        self.toolbar.addAction(exitAction)

        self.statusBar().showMessage("Ready")


def main():
    app = QApplication.instance()
    ex = Example()
    ex.show()
    sys.exit()
    app.exec_()


main()

メニューとツールバー、ステータスバーを作成するにはQMainWindowを使います

class Example(QMainWindow):
    def __init__(self, parent=None, *args, **kwargs):
        super(Example, self).__init__(parent, *args, **kwargs)

Maya PySide2 / PySide チュートリアル 初学編 ④では、QWidgetを使用していましたがなぜ、このチュートリアルではQMainWindowを使用しているのでしょうか?
それはQMainWindowがその名の通りメインウィンドウを提供しており、ステータスバー、ツールバー、メニューバーを備えた古典的なアプリケーションを作ることが簡単にできます
そして、QWidgetなどは通常このQMainWindowに埋め込んで使用していくタイプのインターフェイスになります
PySideのUIを構築する際には基本的にはQMainWindowを用意して、そのQMainWindowにQWidgetやQPushButtonなどを埋め込んで一つのUIを作っていくという流れがベーシックな形になるためこのチュートリアルではQMainWindowを使用しています
(初学編のあとの初心者編ではQMainWindowにインターフェイスつまりウィジェットを埋め込んでいくことを実践的に行っていきますので詳しくはその時に記述できればと考えています)

        openMenu = QMenu("Open")
        openMenu.addAction("help")

QMenu(const QString &title, QWidget *parent = nullptr)はアクションアイテムのリストで構成されており、addAction()、addActions()、insertAction()関数を使用することでアクションの追加ができます

        exitAction = QAction("Exit", self)
        exitAction.setShortcut("Ctrl+G")
        exitAction.triggered.connect(self.close)

QPushButtonやコールバックを書かなくともQAction(const QIcon &icon, const QString &text, QObject *parent = nullptr)を作ることで複数のメニューやツールバーをまたいで使用することができます
上の例ではtriggered.connectでアクションがトリガーされたときにself.closeを実行できようにしています
また、Ctrl+Gショートカットを設定しているのでこの例を実行している際はCtrl+Gでwindowを閉じることができます

        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu("File")
        fileMenu.addMenu(openMenu)
        fileMenu.addAction(exitAction)

self.menuBar()はself、つまりQMainWindowのメニューバーを作成し、QMenuBarを返しています
そしてaddMenuでメニューをメニューバーに追加し、そのメニューに上のほうで宣言したopenMenuexitActionをそれぞれaddMenuaddActionで追加しています

        self.toolbar = self.addToolBar("Exit")
        self.toolbar.addAction(exitAction)

self.addToolBar()はself、つまりQMainWindowのは最初の呼び出しでツールバーを作成し、QToolBarを返しています
そしてそのツールバーにaddActionexitActionをアクションを追加しています

        self.statusBar().showMessage("Ready")

self.statusBar()は最初の呼び出しでステータスバーを作成し、QStatusBarを返しています
self、つまりQMainWindowのステータスバーになります
showMessage()は、ステータスバーにメッセージを表示しています
void QStatusBar::showMessage(const QString &message, int timeout = 0)

Maya PySide2 / PySide チュートリアルのこのパートでは、メニュー、ツールバー、ステータスバー、メインアプリケーションのウィンドウを扱いました

次はMaya PySide2 / PySide チュートリアル 初学編 ⑥
前はMaya PySide2 / PySide チュートリアル 初学編 ④