본문으로 바로가기
반응형

툴바는 텍스트로 된 메뉴를 이미지인 아이콘으로 변환한 것입니다. 텍스트보다는 직관적이고 어떤 기능을 하는지 한눈에 파악할 수 있어서 앱의 필수 요소입니다. 이렇게 자주 사용하는 메뉴는 툴바에 배치합니다. 상속받은 클래스에 따라 툴바 메뉴를 생성하는 방법이 약간 달라질 수 있습니다. 이번 포스팅에서는 QMainWindows 를 상속받은 경우 어떻게 툴바에 메뉴를 추가하는지 알아보겠습니다.

 

1. 툴바 추가하기

 

QMainWindows QWidget 을 상속받아 만든 윈도우 위젯으로 내부에 툴바가 구현되어 있습니다. 이미 생성되어 있는 툴바 객체를 리턴 받기 위해서 사용하는 함수는 QMainWindows addToolBar() 입니다. 아래 함수 목록에서 3번째를 사용합니다. 인수로 툴바의 제목을 넘기고 QToolBar 객체를 리턴받습니다.

 

QToolBar 에 메뉴를 만들기 위해서는 QAction 객체가 필요합니다. QAction 객체를 생성할 때 툴바에 사용할 아이콘은 생성자 함수의 첫 번째 파라미터로 QIcon 객체를 넘겨서 만듭니다. 차후에 setIcon(self, QAction) 함수를 이용해서 추가할 수도 있습니다. 추가한 툴바 버튼의 단축키는 setShortcut() 함수를 이용해서 문자열로 등록합니다. 상태바에 출력할 문자는 setStatusTip() 함수를 이용합니다. 

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

# QMainWindow 의 addToolBar 함수 이용해서 추가하기
phone_action = QAction(QIcon('../widget/btn.png'), 'Call', self)
phone_action.setShortcut('Ctrl+C')
phone_action.setStatusTip('Phone Call')

# 타이틀로 추가
self.file_toolbar = self.addToolBar('File')
self.file_toolbar.addAction(phone_action)

 

두 개 이상의 툴바 버튼은 QAction 객체를 생성해서 QToolBar addAction() 으로 계속 추가할 수 있습니다.

# 1. QMainWindow 의 addToolBar 함수 이용해서 추가하기
phone_action = QAction(QIcon('../widget/btn.png'), 'Call', self)
phone_action.setShortcut('Ctrl+C')
phone_action.setStatusTip('Phone Call')

# 2. QToolBar 객체를 이용해서 추가하기
file_action = QAction(QIcon('../widget/file.png'), 'File', self)
file_action.setShortcut('Ctrl+F')
file_action.setStatusTip('File Choice')

# Action 추가, 클릭 이벤트 연결
self.file_toolbar = self.addToolBar('File')
self.file_toolbar.addAction(phone_action)
self.file_toolbar.addAction(file_action)

 

2. 툴바 클릭 이벤트 추가하기

 

툴바 버튼의 시그널 이벤트를 연결하는 방법은 두 가지입니다. 첫 번째는 QAction triggered 시그널에 연결하는 것입니다. QAction 객체를 생성할 때 triggered 에 함수를 연결합니다. 화면에 추가한 두 개의 QAction 모두 triggered 시그널을 연결했습니다. triggered 시그널은 연결 함수로 checked 라는 boolean 형 값을 전달합니다. 툴바 버튼은 토글이 가능한데, 토글 상태면 True 이고, 클릭하고 다시 원래대로 돌아오면 False 입니다.

# 1. QMainWindow 의 addToolBar 함수 이용해서 추가하기
phone_action = QAction(QIcon('../widget/btn.png'), 'Call', self)
phone_action.setShortcut('Ctrl+C')
phone_action.setStatusTip('Phone Call')
phone_action.triggered.connect(self.phone_toolbar)

# 2. QToolBar 객체를 이용해서 추가하기
file_action = QAction(QIcon('../widget/file.png'), 'File', self)
file_action.setShortcut('Ctrl+F')
file_action.setStatusTip('File Choice')
file_action.triggered.connect(self.file_toolbar)

def phone_toolbar(self, checked):
    print("phone : ", checked)

def file_toolbar(self, checked):
    print("file : ", checked)

 

두 번째는 QToolBar actionTriggered 시그널에 연결하는 것입니다. 첫 번째 소개한 방법과 달리 툴바 하나에만 함수를 연결하면 모든 버튼으로부터 이벤트를 받을 수 있습니다. actionTriggered 은 연결된 함수로 QAction 객체를 넘깁니다. 어떤 버튼을 클릭했는지 넘어온 QAction 으로 구분합니다.

# Action 추가, 클릭 이벤트 연결
self.file_toolbar = self.addToolBar('File')
self.file_toolbar.addAction(phone_action)
self.file_toolbar.addAction(file_action)
self.file_toolbar.actionTriggered.connect(self.click_toolbar)

def click_toolbar(self, menu):
    print(menu.text())

 

지금까지 설명한 내용이 모두 들어간 전체 소스는 다음과 같습니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QApplication, QToolBar, \
    QMainWindow, QAction
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('ToolBar Window')

        # 1. QMainWindow 의 addToolBar 함수 이용해서 추가하기
        phone_action = QAction(QIcon('../widget/btn.png'), 'Call', self)
        phone_action.setShortcut('Ctrl+C')
        phone_action.setStatusTip('Phone Call')
        #phone_action.triggered.connect(self.phone_toolbar)

        # 2. QToolBar 객체를 이용해서 추가하기
        file_action = QAction(QIcon('../widget/file.png'), 'File', self)
        file_action.setShortcut('Ctrl+F')
        file_action.setStatusTip('File Choice')
        #file_action.triggered.connect(self.file_toolbar)

        # Action 추가, 클릭 이벤트 연결
        self.file_toolbar = self.addToolBar('File')
        self.file_toolbar.addAction(phone_action)
        self.file_toolbar.addAction(file_action)
        self.file_toolbar.actionTriggered.connect(self.click_toolbar)

        # file_toolbar = QToolBar('File')
        # file_toolbar.addAction(file_action)
        # self.addToolBar(file_toolbar)

    def click_toolbar(self, menu):
        print(menu.text())

    def phone_toolbar(self, checked):
        print("phone : ", checked)

    def file_toolbar(self, checked):
        print("file : ", checked)

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