[PyQt5] Menubar의 동작 지정하기

이 페이지에서는 PyQt5 어플리케이션에서 중심 위젯을 지정하고,

메뉴바의 메뉴 선택 시 특정 동작을 수행하도록 하는 프로그램을 만들어봅니다.



예제

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QAction, qApp, QWidget,
                           QPushButton, QHBoxLayout, QVBoxLayout, QTextEdit)
from PyQt5.QtCore import QDate, Qt
from PyQt5.QtGui import QIcon


class MyApp(QMainWindow):

  def __init__(self):
      super().__init__()
      self.initUI()

  def initUI(self):
      addDateAction = QAction(QIcon('text.png'), 'Add', self)
      addDateAction.setShortcut('Ctrl+D')
      addDateAction.setStatusTip('Add Today\'s Date')
      addDateAction.triggered.connect(self.add_date)

      exitAction = QAction(QIcon('exit.png'), 'Exit', self)
      exitAction.setShortcut('Ctrl+Q')
      exitAction.setStatusTip('Exit Application')
      exitAction.triggered.connect(qApp.quit)

      self.statusBar()

      menubar = self.menuBar()
      filemenu = menubar.addMenu('&File')
      filemenu.addAction(addDateAction)
      filemenu.addAction(exitAction)

      self.cent_widget = CentWidget()
      self.setCentralWidget(self.cent_widget)

      self.setWindowTitle('Menubar')
      self.setGeometry(300, 300, 400, 300)
      self.show()

  def add_date(self):
      today = QDate.currentDate().toString(Qt.ISODate)
      self.cent_widget.te.setText(today)


class CentWidget(QWidget):

  def __init__(self):
      super().__init__()
      self.te = QTextEdit()

      self.okButton = QPushButton('OK')
      self.cancelButton = QPushButton('Cancel')
      hbox = QHBoxLayout()
      hbox.addStretch(1)
      hbox.addWidget(self.okButton)
      hbox.addWidget(self.cancelButton)
      hbox.addStretch(1)

      vbox = QVBoxLayout()
      vbox.addStretch(1)
      vbox.addWidget(self.te)
      vbox.addLayout(hbox)
      vbox.addStretch(1)

      self.setLayout(vbox)


if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = MyApp()
  sys.exit(app.exec_())

PyQt5의 소개와 기초 내용에 대해서는 먼저 PyQt5 Tutorial - 파이썬으로 만드는 나만의 GUI 프로그램 페이지를 참고하세요.

addDateAction, exitAction은 각각 QAction 객체로서 이벤트 핸들러에 연결되어서 특정 동작을 수행합니다.

addDateActionadd_date() 메서드에 연결되어서 어플리케이션의 텍스트 편집기에 오늘의 날짜를 입력합니다.

PyQt5의 날짜와 시간을 표시하는 방법에 대해서는 이 링크를 참고하세요.

exitActionqApp.quit에 연결되어서 메뉴 선택 시 어플리케이션을 종료하는 기능을 갖습니다.

menuBar()를 호출함으로써 메뉴바를 하나 만들고, addMenu()를 사용해서 ‘File’ 메뉴를 하나 추가했습니다.

그리고 addAction()를 사용해서 ‘File’ 메뉴는 두 개의 동작을 포함하도록 했습니다.

self.cent_widgetCentWidget 클래스의 인스턴스로서, 텍스트 편집기와 두 개의 푸시 버튼을 포함합니다.

setCentralWidget()을 사용해서 이 위젯 (self.cent_widget)을 어플리케이션의 중심 위젯 (central widget)으로 지정했습니다.

위젯을 배치하는 방식에 대해서는 박스 레이아웃 페이지를 참고하세요.

아래 그림과 같이 메뉴의 Add 동작을 클릭하면 텍스트 편집기가 초기화되면서 첫 줄에 오늘의 날짜가 입력됩니다.


pyqt5_menubar_action_01

pyqt5_menubar_action_02