본문으로 바로가기
반응형

 

PyQt5 에서는 윈도우 상단 드롭 다운 메뉴를 쉽게 구현할 수 있도록 지원합니다. 메뉴를 구현할 때 사용하는클래스는 QMenuBar 입니다. QMainWindow 클래스를 상속받으면 내장 함수 menuBar() 로 메뉴 객체를 바로 생성할 수 있기 때문에 쉽게 구현이 가능합니다. 오늘은 QMainWindow 를 상속받아서 클래스를 만들고 QMenuBar 객체에 QAction 를 추가해서 드롭다운 메뉴를 만들어 보겠습니다.

 

먼저 메뉴바에 추가할 메뉴들을 생성합니다. 개별 메뉴 객체는 QAction 위젯입니다. QAction 은 동작(action) 클래스라고 하는데, 메뉴와 툴바 버튼, 단축키 를 추가할 때 사용합니다. 위젯에는 addAction() 함수를 사용해서 추가합니다. QAction 에는 아이콘, 메뉴명, 단축키, 툴팁, 상태값 등을 표시할 수 있습니다. 사용하는 함수는 아래와 같습니다.

 

  • setIcon() : 아이콘 추가
  • setText() : 메뉴명 추가
  • setIconText() : 아이콘 이름 추가
  • setShortcut() : 단축키 추가
  • setStatusTip() : 상태값에 표시할 텍스트 추가
  • setToolTip () : 툴팁 텍스트 추가

 

소스에서 마지막으로 추가한 것은 메뉴 클릭 이벤트인 triggered 시그널입니다. triggered 이벤트에 직접 만든 함수를 연결합니다. 그리고 QAction 객체를 3개 만듭니다.

from PyQt5.QtWidgets import QAction
from PyQt5.QtGui import QIcon

# Create new action
new_action = QAction(QIcon('new.png'), '&New', self)
new_action.setShortcut('Ctrl+N')
new_action.setStatusTip('새 파일 생성')
new_action.triggered.connect(self.menu_newcall)

# Open new action
open_action = QAction(QIcon('open.png'), '&Open', self)
open_action.setShortcut('Ctrl+O')
open_action.setStatusTip('파일 열기')
open_action.triggered.connect(self.menu_opencall)

# Exit action
close_action = QAction(QIcon('close.png'), '&Exit', self)
close_action.setShortcut('Ctrl+Q')
close_action.setStatusTip('종료')
close_action.triggered.connect(self.menu_closecall)

 

위에서 만든 QAction 객체를 QMenuBar 에 추가하겠습니다. 그 전에 동작(action) 이 없는 주 메뉴를 addMenu() 함수로 추가합니다. addMenu() 를 이용해서 추가하는 메뉴 객체는 QMenu 입니다. QMenuBar 에 추가하는 메뉴의 종류에는 QMenu QAction 이 있는데, QMenu 의 하위 드롭다운 메뉴로 들어가는 것이 QAction 입니다. addMenu() 를 이용해서 QMenuBar 에 주 메뉴를 추가하고 그 하위에 addAction() 으로 QAction 를 붙입니다.

menu_bar = self.menuBar()
file_menu = menu_bar.addMenu('&File')
file_menu.addAction(new_action)
file_menu.addAction(open_action)
file_menu.addAction(close_action)

 

QAction 으로 추가한 동작 메뉴 객체를 생성할 때 단축키 함수인 setShortcut() 과 상태바에 표시할 텍스트 정보를 setStatusTip() 로 세팅했었습니다. 상태바에 정상적으로 값이 표현되는지 알아보기 위해 QMainWindow 에 상태바를 추가합니다. QMainWindow 의 내장함수 statusBar() 를 이용하면 QStatusBar 객체생성이 가능하며, setStatusBar() 를 이용해서 화면에 바로 추가할 수 있습니다.

# ---------- Status bar add --------------
# 화면에 상태바 추가
status_bar = self.statusBar()
self.setStatusBar(status_bar)

 

이렇게 추가한 정보는 아래 이미지와 같이 확인할 수 있습니다. 메뉴에 마우스를 가져가면 화면 아래 상태바에 setStatusTip() 함수로 추가한 텍스트가 나타납니다.

 

다음은 각 QAction 드롭다운 메뉴의 triggered 이벤트에 연결한 함수 목록입니다. 버튼을 클릭하면 실행되는 함수로 제대로 동작하는지 확인하기 위해 콘솔에 print 하는 기능만 들어가 있습니다.

# 새 파일 생성 함수 호출
def menu_newcall(self):
    print('new menu call')

# 파일 열기 함수 호출
def menu_opencall(self):
    print('open menu call')

# 윈도우 종료 함수 호출
def menu_closecall(self):
    print('exit menu call')
    sys.exit()

 

전체 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QAction, QMainWindow, QApplication
from PyQt5.QtGui import QIcon

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(300, 300, 500, 300)  # x, y, w, h
        self.setWindowTitle('Menu Window')

        # ---------- Menun bar add ---------------
        # Create new action
        new_action = QAction(QIcon('new.png'), '&New', self)
        new_action.setShortcut('Ctrl+N')
        new_action.setStatusTip('새 파일 생성')
        new_action.triggered.connect(self.menu_newcall)

        # Open new action
        open_action = QAction(QIcon('open.png'), '&Open', self)
        open_action.setShortcut('Ctrl+O')
        open_action.setStatusTip('파일 열기')
        open_action.triggered.connect(self.menu_opencall)

        # Exit action
        close_action = QAction(QIcon('close.png'), '&Exit', self)
        close_action.setShortcut('Ctrl+Q')
        close_action.setStatusTip('종료')
        close_action.triggered.connect(self.menu_closecall)

        menu_bar = self.menuBar()
        file_menu = menu_bar.addMenu('&File')
        file_menu.addAction(new_action)
        file_menu.addAction(open_action)
        file_menu.addAction(close_action)

        # ---------- Status bar add --------------
        # 화면에 상태바 추가
        status_bar = self.statusBar()
        self.setStatusBar(status_bar)

    # 새 파일 생성 함수 호출
    def menu_newcall(self):
        print('new menu call')

    # 파일 열기 함수 호출
    def menu_opencall(self):
        print('open menu call')

    # 윈도우 종료 함수 호출
    def menu_closecall(self):
        print('exit menu call')
        sys.exit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())

반응형