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_())
'파이썬 > PyQt5' 카테고리의 다른 글
파이썬(Python) PyQt5 파일 다이얼로그 QFontDialog 사용하는 방법 (0) | 2021.12.06 |
---|---|
파이썬(Python) PyQt5 윈도우 화면 최소, 최대화 이벤트 함수 구현하기 (0) | 2021.12.02 |
파이썬(Python) PyQt5 윈도우 마우스 이벤트 정보 알아 오는 방법 (0) | 2021.11.30 |
파이썬(Python) PyQt5 사용자 입력 다이얼 로그 QInputDialog 사용하기 (0) | 2021.11.29 |
파이썬(Python) PyQt5 QWheelEvent 마우스 휠 이벤트 사용하기 (0) | 2021.11.28 |