본문 바로가기
Python Library/PySide

[PySide] 툴바 (Toolbars)

by goatlab 2022. 6. 27.
728x90
반응형
SMALL

Toolbars

 

가장 일반적으로 볼 수 있는 사용자 인터페이스 요소 중 하나는 도구 모음이다. 도구 모음은 메뉴를 통한 액세스가 번거로운 응용 프로그램 내에서 일반적인 작업을 수행하는 데 사용되는 아이콘 또는 텍스트 막대이다. 이는 많은 애플리케이션에서 볼 수 있는 가장 일반적인 UI 기능 중 하나이다. 특히, Microsoft Office 제품군의 일부 복잡한 응용 프로그램은 상황에 맞는 'ribbon' 인터페이스로 이동되었지만 일반적으로 만들려는 대부분의 응용 프로그램에는 표준 도구 모음으로 충분하다.

 

표준 GUI 요소

import sys
from PySide6.QtWidgets import (
    QMainWindow, QApplication,
    QLabel, QToolBar, QStatusBar
)
from PySide6.QtGui import QAction, QIcon
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My Awesome App")

app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()

 

도구 모음 추가

 

Qt에서 도구 모음은 QToolBar 클래스에서 생성된다. 시작하려면 클래스의 인스턴스를 만든 다음 QMainWindow의 .addToolbar를 호출한다. 첫 번째 매개변수로 문자열을 전달 QToolBar하여 UI에서 도구 모음을 식별하는 데 사용되는 도구 모음의 이름을 설정한다.

 

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My Awesome App")

        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)

        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        self.addToolBar(toolbar)

    def onMyToolBarButtonClick(self, s):
        print("click", s)

도구 모음이 있는 창

 

툴바를 좀 더 흥미롭게 만들어야 한다. QButton 위젯을 추가할 수도 있지만 Qt에는 몇 가지 추가 기능을 제공하는 더 나은 접근 방식이 있다. 그것은 QAction으로 추상 사용자 인터페이스를 설명하는 방법을 제공하는 클래스이다. 이것이 영어로 의미하는 바는 단일 개체 내에서 여러 인터페이스 요소를 정의할 수 있으며 해당 요소와 상호 작용하는 효과로 통합될 수 있다는 것이다. 예를 들어, 도구 모음뿐만 아니라 메뉴에도 표시되는 기능을 갖는 것이 일반적이다. 편집 메뉴뿐만 아니라 도구 모음에도 가위로 표시되는 편집잘라내기와 같은 것을 생각하면 된다.

 

QAction이 없다면 이것을 여러 곳에서 정의해야 할 것이다. 그러나 트리거된 작업을 정의하는 단일 QAction을 정의한 다음 이 작업을 메뉴와 도구 모음 모두에 추가할 수 있다. 각각 QAction에는 연결할 수 있는 이름, 상태 메시지, 아이콘 및 신호가 있다.

 

아래 코드에서 이것이 먼저 QAction이 추가된 것을 볼 수 있다.

 

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My Awesome App")

        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)

        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        self.addToolBar(toolbar)

        button_action = QAction("Your button", self)
        button_action.setStatusTip("This is your button")
        button_action.triggered.connect(self.onMyToolBarButtonClick)
        toolbar.addAction(button_action)

    def onMyToolBarButtonClick(self, s):
        print("click", s)

 

먼저, QAction의 신호를 받아들이는 함수를 생성하여 작동하는지 확인할 수 있습니다. 다음으로 우리는 자신을 정의합니다 QAction. 인스턴스를 생성할 때 작업 및/또는 아이콘에 대한 레이블을 전달할 수 있습니다. 액션의 부모 역할을 하려면 any도 전달해야 합니다 QObject. 여기서는 self기본 창에 대한 참조로 전달합니다. 이상하게도 QAction상위 요소의 경우 최종 매개변수로 전달됩니다.

 

다음으로 상태 팁을 설정하도록 선택할 수 있다. 이 텍스트는 일단 하나가 있으면 상태 표시줄에 표시된다. 마지막으로 .triggered 신호를 사용자 정의 함수에 연결한다. 이 QAction 신호는 트리거 (또는 활성화)될 때마다 발생한다.

 

QAction 버튼을 보여주는 툴바

 

다음으로 상태 표시줄을 추가할 수 있다.

 

새로운 상태 표시줄 개체를 가져오기 위해 QStatusBar를 호출한 다음 이를 에 전달하여 상태 표시줄 setStatusBar 개체를 만든다. statusBar 설정을 변경할 필요가 없으므로 생성할 때 한 줄로 전달할 수도 있다.

 

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My Awesome App")

        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)

        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        self.addToolBar(toolbar)

        button_action = QAction("Your button", self)
        button_action.setStatusTip("This is your button")
        button_action.triggered.connect(self.onMyToolBarButtonClick)
        toolbar.addAction(button_action)

        self.setStatusBar(QStatusBar(self))

    def onMyToolBarButtonClick(self, s):
        print("click", s)

작업을 가리키면 상태 표시줄 텍스트가 업데이트

 

다음으로 QAction 토글 가능을 켤 것이므로 클릭하면 켜지고 다시 클릭하면 꺼진다. 이를 위해 QAction 객체를 간단하게 setCheckable(True)를 호출한다.

 

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My Awesome App")

        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)

        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        self.addToolBar(toolbar)

        button_action = QAction("Your button", self)
        button_action.setStatusTip("This is your button")
        button_action.triggered.connect(self.onMyToolBarButtonClick)
        button_action.setCheckable(True)
        toolbar.addAction(button_action)

        self.setStatusBar(QStatusBar(self))

    def onMyToolBarButtonClick(self, s):
        print("click", s)

도구 모음 버튼이 켜짐

 

버튼에 아이콘을 추가해 본다. 이를 위해 디자이너 Yusuke Kamiyamane이 설정한 푸가 아이콘을 다운로드하는 것이 좋다. 앱에 멋진 전문적인 느낌을 줄 수 있는 16x16 아이콘 세트이다. 응용 프로그램을 배포할 때 필요한 저작자 표시만 있으면 무료로 사용할 수 있다.

 

푸가 아이콘 세트 — Yusuke Kamiyamane

 

세트에서 이미지를 선택하고 (여기의 예제에서는 파일을 선택 bug.png) 소스 코드와 동일한 폴더에 복사한다. QIcon 파일 이름을 클래스에 전달하여 객체를 생성할 수 있다. 예를 들어, QIcon('bug.png') 파일을 다른 폴더에 저장하면 해당 파일에 대한 전체 상대 또는 절대 경로가 필요하다.

 

또한 도구 모음에 아이콘의 크기를 알려야 한다. 그렇지 않으면 아이콘이 많은 패딩으로 둘러싸여 있다. QSize 객체로 .setIconSize()를 호출하여 이를 수행할 수 있다.

 

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.setWindowTitle("My Awesome App")

        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)

        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        toolbar.setIconSize(QSize(16,16))
        self.addToolBar(toolbar)

        button_action = QAction(QIcon("bug.png"), "Your button", self)
        button_action.setStatusTip("This is your button")
        button_action.triggered.connect(self.onMyToolBarButtonClick)
        button_action.setCheckable(True)
        toolbar.addAction(button_action)

        self.setStatusBar(QStatusBar(self))

    def onMyToolBarButtonClick(self, s):
        print("click", s)

아이콘이 있는 작업 버튼

 

기본값은 Qt.ToolButtonFollowStyle이다. 즉, 응용 프로그램이 실행되는 데스크탑의 표준/전역 설정을 기본적으로 따른다. 이것은 일반적으로 애플리케이션이 가능한 한 네이티브처럼 느껴지도록 하는 것이 좋다.

 

마지막으로 도구 모음에 몇 가지 비트와 밥을 더 추가할 수 있다. 두 번째 버튼과 체크박스 위젯을 추가한다. 언급한 바와 같이 여기에 모든 위젯을 문자 그대로 넣을 수 있으므로 자유롭게 사용하면 된다.

 

import sys

from PySide6.QtCore import QSize, Qt
from PySide6.QtGui import QAction, QIcon
from PySide6.QtWidgets import (
    QApplication,
    QCheckBox,
    QLabel,
    QMainWindow,
    QStatusBar,
    QToolBar,
)

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        label = QLabel("Hello!")
        label.setAlignment(Qt.AlignCenter)

        self.setCentralWidget(label)

        toolbar = QToolBar("My main toolbar")
        toolbar.setIconSize(QSize(16, 16))
        self.addToolBar(toolbar)

        button_action = QAction(QIcon("bug.png"), "&Your button", self)
        button_action.setStatusTip("This is your button")
        button_action.triggered.connect(self.onMyToolBarButtonClick)
        button_action.setCheckable(True)
        toolbar.addAction(button_action)

        toolbar.addSeparator()

        button_action2 = QAction(QIcon("bug.png"), "Your &button2", self)
        button_action2.setStatusTip("This is your button2")
        button_action2.triggered.connect(self.onMyToolBarButtonClick)
        button_action2.setCheckable(True)
        toolbar.addAction(button_action2)

        toolbar.addWidget(QLabel("Hello"))
        toolbar.addWidget(QCheckBox())

        self.setStatusBar(QStatusBar(self))

    def onMyToolBarButtonClick(self, s):
        print("click", s)

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

작업과 두 개의 위젯이 있는 도구 모음

728x90
반응형
LIST

'Python Library > PySide' 카테고리의 다른 글

[PySide] 대화 상자 (Dialogs) (1)  (0) 2022.06.27
[PySide] 메뉴 (Menus)  (0) 2022.06.27
[PySide] 레이아웃 (Layouts) (3)  (0) 2022.06.23
[PySide] 레이아웃 (Layouts) (2)  (0) 2022.06.23
[PySide] 레이아웃 (Layouts) (1)  (0) 2022.06.23