PySide6 002

2024/01/21に公開

MainWindowをカスタマイズ

もうちょっと実用的なアプリケーションとして画像ビューワーを作ってみましょう

ImageViewer_001.py
import sys
from PySide6.QtWidgets import QApplication, QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hello World")
        self.setGeometry(100, 100, 800, 600)

def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

メニューの追加

QMainWindowのmenuBar()で取得したQMenuBarオブジェクトにたいしてaddMenu()でメニューを追加します

    def create_menu(self):
        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("File")
        file_menu.addAction("Open")
        file_menu.addAction("Exit")

追加されましたね

今度はメニューを選択したときのアクションを追加してみましょう

import sys
from PySide6.QtWidgets import (
    QApplication, QMainWindow, 
    QMessageBox, QFileDialog)
from PySide6.QtGui import QAction

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hello World")
        self.setGeometry(100, 100, 800, 600)

        self.create_menu()

    def create_menu(self):
        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("File")
        
        open_action = QAction("開く", self)
        open_action.triggered.connect(self.open_file)
        file_menu.addAction(open_action)

        exit_action = QAction("終了", self)
        exit_action.triggered.connect(self.exit_application)
        file_menu.addAction(exit_action)

    def open_file(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "Open File", "", "Images (*.jpg *.png *.gif)")
        QMessageBox.information(self, "開く", file_name.split('/')[-1])        

    def exit_application(self):
        self.close()

def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec())

if __name__ == "__main__":
    main()      

選択したファイルを表示する

scrollエリアを追加
QPixmapを使って選択した画像を読み込み
QLabelのsetPixmapでLabelに画像を表示している。

sinple_image_viewer.py
import sys
from PySide6.QtWidgets import (
    QApplication, QMainWindow, QScrollArea,
    QMessageBox, QFileDialog, QLabel)
from PySide6.QtGui import QAction, QPixmap
from PySide6.QtCore import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Hello World")
        self.setGeometry(100, 100, 800, 600)

        self.current_pixmap = None
        self.image_label = QLabel()
        self.scroll_area = QScrollArea(self)

        self.scroll_area.setWidgetResizable(True)
        self.setCentralWidget(self.scroll_area)

        self.scroll_area.setWidget(self.image_label)
        self.image_label.setAlignment(Qt.AlignCenter)
        self.scroll_area.setWidget(self.image_label)
        self.create_menu()

    def create_menu(self):
        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu("File")
        
        open_action = QAction("開く", self)
        open_action.triggered.connect(self.open_file)
        file_menu.addAction(open_action)

        exit_action = QAction("終了", self)
        exit_action.triggered.connect(self.exit_application)
        file_menu.addAction(exit_action)

    def open_file(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "Open File", "", "Images (*.jpg *.png *.gif)")
        self.show_image(file_name)

    def show_image(self, file_name):
        self.current_pixmap = QPixmap(file_name)
        self.image_label.setPixmap(self.current_pixmap)

    def exit_application(self):
        self.close()

def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec())

if __name__ == "__main__":
    main()

Discussion