- Custom Widget2026년 06월 16일
- 소쩍소쩍이
- 작성자
- 2026.06.16.:43
리소스 정의 파일 만들기
Qt의 리소스 시스템을 사용하려면 먼저 res.qrc 파일을 생성해야 합니다.
생성한 .qrc 파일은 리소스 컴파일러를 통해 Python 코드 파일인 res.py로 변환하여 사용합니다.
pyside6-rcc res.qrc -o res.pyres.py 안에는 PNG 이미지 데이터가 포함됩니다.
코드에서 import res를 실행하면 내부적으로 qInitResources()가 호출되어 :/res/normal.png 와 같은 경로로 리소스에 접근할 수 있습니다.
QWidget에 내장된 이벤트 핸들러
Qt의 QWidget에는 다양한 이벤트를 처리하기 위한 이벤트 핸들러가 기본적으로 제공됩니다.
이벤트 (트리거) 이벤트 핸들러 위젯에 마우스 진입 enterEvent() 위젯에서 마우스 이탈 leaveEvent() 마우스 버튼 클릭 mousePressEvent() 마우스 버튼 해제 mouseReleaseEvent() 다시 그리기 요청 update() 실제 화면 그리기 paintEvent() enterEvent(), leaveEvent(), mousePressEvent() 등의 함수는 직접 호출하는 함수가 아닙니다.
사용자의 행동에 따라 Qt가 자동으로 호출하는 이벤트 핸들러입니다.
update()
update()는 화면을 즉시 다시 그리는 함수가 아닙니다.
이벤트 루프에 "이 위젯을 다시 그려야 한다"는 요청을 등록하고, 이후 적절한 시점에 paintEvent()가 호출됩니다.
커스텀 위젯 ImageButton 만들기 예제
다음 예제는 QWidget을 상속받아 이미지 버튼을 직접 구현한 예제입니다.
마우스 진입, 클릭, 해제 상태에 따라 다른 이미지를 출력하도록 구현되어 있습니다.
from PySide6.QtWidgets import QWidget from PySide6.QtGui import QPainter, QImage, QMouseEvent from PySide6.QtCore import Signal import res # 리소스 등록 (:/res/xxx.png 사용 가능) # 상태 상수 정의 BEHAVIOUR_NORMAL = 0 # 기본 상태 BEHAVIOUR_ENTER = 1 # 마우스가 버튼 위에 올라간 상태 BEHAVIOUR_LEAVE = 2 # 마우스가 버튼을 벗어난 상태 BEHAVIOUR_PRESS = 3 # 버튼을 누른 상태 BEHAVIOUR_DISABLE = 4 # 비활성화 상태 class ImageButton(QWidget): # 사용자 정의 시그널 clicked = Signal() # 버튼 클릭 시 발생 hovering = Signal() # 마우스가 버튼 위에 올라가면 발생 def __init__(self, parent=None): super(ImageButton, self).__init__(parent) self._disabled = False # 비활성화 여부 self._behaviour = BEHAVIOUR_NORMAL # 현재 버튼 상태 self._iamgeFileName = "" # 표시할 이미지 경로 # 기본 이미지 크기를 기준으로 위젯 크기 지정 image = QImage(":/res/normal") self.setFixedWidth(image.width()) self.setFixedHeight(image.height()) def enterEvent(self, event): self._behaviour = BEHAVIOUR_ENTER # 마우스 진입 상태 변경 self.update() # 다시 그리기 요청 self.hovering.emit() # hovering 시그널 발생 def leaveEvent(self, event): self._behaviour = BEHAVIOUR_NORMAL # 기본 상태로 변경 self.update() # 다시 그리기 요청 def mousePressEvent(self, event): self._behaviour = BEHAVIOUR_PRESS # 눌림 상태 변경 self.update() # 다시 그리기 요청 self.clicked.emit() # clicked 시그널 발생 def mouseReleaseEvent(self, event): self._behaviour = BEHAVIOUR_ENTER # 마우스가 버튼 위에 있으므로 ENTER 상태 self.update() # 다시 그리기 요청 def setDisabled(self, val): self._disabled = val # 비활성화 상태 저장 self.update() # 다시 그리기 요청 def paintEvent(self, event): painter = QPainter(self) # 화면에 그림을 그리기 위한 객체 생성 # 상태에 따라 사용할 이미지 경로 결정 if self._disabled: self._iamgeFileName = ":/res/disable" # 비활성화 이미지 else: if self._behaviour == BEHAVIOUR_NORMAL: self._iamgeFileName = ":/res/normal" # 기본 이미지 elif self._behaviour == BEHAVIOUR_ENTER: self._iamgeFileName = ":/res/enter" # 마우스 진입 이미지 elif self._behaviour == BEHAVIOUR_LEAVE: self._iamgeFileName = ":/res/normal" # 기본 이미지 elif self._behaviour == BEHAVIOUR_PRESS: self._iamgeFileName = ":/res/press" # 눌림 이미지 image = QImage(self._iamgeFileName) # 이미지 로드 painter.drawImage(0, 0, image) # (0,0) 위치에 이미지 출력'PySide6 > Resource' 카테고리의 다른 글
CSS 스타일 적용하기 (0) 2026.06.16 Resource (0) 2026.06.08 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)