본문 바로가기
코딩취미/Python

QLineEdit 안에 Button 넣는 방법 : QToolButton or QAction 사용

by 브링블링 2024. 6. 11.
반응형

QLineEdit 안에 Button 넣는 방법 : QToolButton or QAction 사용

QLineEdit 내부에 버튼을 추가하는 것은 사용자 경험을 향상시키고 인터페이스를 직관적으로 만드는 데 유용한 기능입니다. 이를 구현하는 방법으로는 QToolButton과 QAction을 사용하는 두 가지 접근 방식이 있습니다. 각 방법은 고유한 장점과 단점을 가지고 있어, 특정 요구 사항과 사용 시나리오에 따라 적합한 방법을 선택할 수 있습니다. 이 글에서는 QToolButton과 QAction을 활용하여 QLineEdit 내부에 버튼을 추가하는 방법을 비교하고, 각 방법의 특징을 살펴보겠습니다.

QToolButton

QToolButton은 독립적인 버튼 위젯으로, QLineEdit 내부에 직접 추가할 수 있습니다. 주로 툴바나 대화 상자에서 사용되지만, QLineEdit 내부에서도 활용할 수 있습니다.

장점:

  • 직관적 사용: QToolButton은 직관적으로 사용하기 쉬운 독립적인 버튼입니다.
  • 유연한 스타일링: QToolButton은 크기, 아이콘, 텍스트 등을 쉽게 설정할 수 있으며 스타일시트를 통해 자유롭게 스타일링이 가능합니다.
  • 독립성: QToolButton은 하나의 위젯으로 독립적으로 동작하며, 이벤트 핸들링이 직접적입니다.
  • 위치 조정 가능: 버튼의 위치를 수동으로 조정할 수 있어 정밀한 위치 설정이 가능합니다.

단점:

  • 복잡한 레이아웃 관리: QLineEdit 같은 위젯 내부에 삽입할 때 위치 조정을 위한 코드가 다소 복잡할 수 있습니다.
  • 이벤트 핸들링 필요: 크기 변경 등 이벤트에 따라 위치를 재조정해야 하므로 추가적인 이벤트 핸들링이 필요합니다.

QToolButton 예제

from PySide6.QtWidgets import QApplication, QLineEdit, QToolButton, QStyle, QVBoxLayout, QWidget, QFileDialog
from PySide6.QtCore import QSize, Qt

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.ledProjectFolder = QLineEdit(self)
        self.ledProjectFolder.setReadOnly(True)
        self.ledProjectFolder.setPlaceholderText("Click the button to select a folder")

        self.btnProjectFolder = QToolButton(self.ledProjectFolder)
        folder_icon = self.ledProjectFolder.style().standardIcon(QStyle.SP_DirOpenIcon)
        self.btnProjectFolder.setIcon(folder_icon)
        self.btnProjectFolder.setIconSize(QSize(16, 16))
        self.btnProjectFolder.setCursor(Qt.ArrowCursor)
        self.btnProjectFolder.setStyleSheet("border: none; padding: 0px;")
        self.btnProjectFolder.setFixedSize(16, 16)

        # QLineEdit의 오른쪽에 여백 설정 및 버튼 위치 설정
        self.ledProjectFolder.setTextMargins(0, 0, self.btnProjectFolder.width(), 0)
        self.adjust_button_position()

        # QLineEdit 크기 변경 시 버튼 위치 재조정
        self.ledProjectFolder.resizeEvent = self.on_resize

        # 버튼 클릭 시 폴더 다이얼로그 열기
        self.btnProjectFolder.clicked.connect(self.openFolderDialog)

        layout = QVBoxLayout(self)
        layout.addWidget(self.ledProjectFolder)
        self.setLayout(layout)

    def adjust_button_position(self):
        self.btnProjectFolder.move(self.ledProjectFolder.rect().right() - self.btnProjectFolder.width(), 
                                   (self.ledProjectFolder.rect().bottom() - self.btnProjectFolder.height()) // 2)

    def on_resize(self, event):
        self.adjust_button_position()
        super(QLineEdit, self.ledProjectFolder).resizeEvent(event)

    def openFolderDialog(self):
        folder = QFileDialog.getExistingDirectory(self, "Select Folder")
        if folder:
            self.ledProjectFolder.setText(folder)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec())
반응형

QAction

QAction은 특정 동작을 정의하고 여러 위젯에서 재사용할 수 있는 클래스입니다. 메뉴 항목이나 툴바 버튼 등에서 주로 사용되며, QLineEdit 내부에 추가할 때는 addAction 메소드를 사용합니다.

장점:

  • 재사용성: QAction은 여러 위치에서 동일한 동작을 재사용할 수 있습니다. 예를 들어, 메뉴, 툴바, 컨텍스트 메뉴 등에서 동일한 액션을 사용할 수 있습니다.
  • 간편한 추가: QLineEdit 내부에 간편하게 삽입할 수 있으며, addAction 메소드로 쉽게 추가할 수 있습니다.
  • 다양한 설정: 아이콘, 텍스트, 단축키, 상태팁 등을 간편하게 설정할 수 있습니다.

단점:

  • 유연성 부족: QToolButton에 비해 위치 및 스타일링의 유연성이 떨어질 수 있습니다.
  • 독립성 부족: QAction은 자체적으로는 인터페이스 요소가 아니기 때문에 QToolButton처럼 독립적으로 사용되지 않습니다.

QAction 예제

from PySide6.QtWidgets import QApplication, QLineEdit, QAction, QFileDialog, QVBoxLayout, QWidget, QStyle
from PySide6.QtGui import QIcon

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.ledProjectFolder = QLineEdit(self)
        self.ledProjectFolder.setReadOnly(True)
        self.ledProjectFolder.setPlaceholderText("Click the button to select a folder")

        folder_icon = self.ledProjectFolder.style().standardIcon(QStyle.SP_DirOpenIcon)
        self.actionProjectFolder = QAction(folder_icon, "", self)
        
        # QAction을 QLineEdit의 오른쪽에 추가
        self.ledProjectFolder.addAction(self.actionProjectFolder, QLineEdit.TrailingPosition)

        # QAction 트리거 시 폴더 다이얼로그 열기
        self.actionProjectFolder.triggered.connect(self.openFolderDialog)

        layout = QVBoxLayout(self)
        layout.addWidget(self.ledProjectFolder)
        self.setLayout(layout)

    def openFolderDialog(self):
        folder = QFileDialog.getExistingDirectory(self, "Select Folder")
        if folder:
            self.ledProjectFolder.setText(folder)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec())

특징 요약

QToolButton

  • 용도: 독립적인 버튼으로 사용
  • 장점: 직관적 사용, 유연한 스타일링, 독립성
  • 단점: 복잡한 레이아웃 관리, 이벤트 핸들링 필요

QAction

  • 용도: 메뉴, 툴바 등에서 동일한 동작을 공유
  • 장점: 재사용성, 간편한 추가, 다양한 설정
  • 단점: 유연성 부족, 독립성 부족
반응형