728x90

1. GUI 프로그램에서 리소스란?

더보기

1. 프로그램 내부에서 사용하는 외부 파일들의 집합


리소스 예시

  • 이미지 파일 (PNG, JPG)
  • 아이콘 (ICO, SVG)
  • 스타일시트(.qss)
  • UI 템플릿(.html, .json 등)
  • 소리(.wav, .mp3)
  • 글꼴(.ttf)

이런 것들을 통칭해서 리소스(Resource) 라고 부릅니다.

 

 

 

 

2. 왜 리소스가 필요한가?

 

GUI 프로그램에서는 다음이 필요합니다:

  • 버튼 아이콘
  • 메뉴 아이콘
  • 배경 그림
  • 로딩 이미지
  • 설정 초기값 템플릿 등

이걸 파일로 두면 편하지만, 예를 들어 Windows에서 myapp.exe 만 배포하고 싶은데
외부에 이미지가 다음처럼 있으면

myapp.exe
res/ #폴더명
   new.png #리소스파일
   open.png
   save.png

배포할 때 폴더를 추가로 실행 파일과 함께 배포해야 합니다. 그리고

  • 경로가 다르면 동작 안 함
  • 설치 위치 바뀌면 동작 안 함
  • exe 파일 하나로 배포 불가능
  • exe 크랙/수정 위험 증가
  • 백신 프로그램 오진 발생 가능

즉, 외부 파일 의존성이 생긴다.

 

 

 

 

3. 그래서 Qt의 리소스 시스템은

모든 리소스 파일을 프로그램 내부에 패킹하여 하나의 실행 파일(exe)에 포함시키는 기술 입니다.

 

 

 

 

4. 주의 사항

 

리소스 파일은 컴파일 과정에서 붙여 넣어진 정적 데이터 이므로:

  • exe 안에 바이너리 덩어리로 포함됨.
  • 읽는 것(로드)은 가능
  • 쓰는 것(저장/덮어쓰기)은 불가능하다.

그러므로, 프로그램 실행 후 저장이 필요한 데이터는, 리소스가 아닌 일반 파일에 저장해야 힙니다.

 

일반 파일 예시

  • 앱 설정 파일: .json
  • 로그 파일: .log
  • 사용자 저장 파일: .txt
  • 캐시 파일: .dat

이런 것은 OS가 제공하는 디렉토리에 저장해야 합니다.

 

2. 리소스 파일, prefix, 경로 이해

더보기

1. 리소스를 사용하면:

  • 소스코드 프로그래밍 과정에서
    C:/project/icons/save.png 같은 절대경로 사용 안함

  • 리소스를 소스코드에 사용할 때,
    prefix + alias 결합만으로, 실제 파일의 절대 경로를 대신합니다.

 

 

 

2. <.res.qrc> 파일 작성 (리소스 포맷 예시)

<RCC>
    <!-- prefix로 카테고리 묶기: /icons -->
    <qresource prefix="/icons">
        <file alias="save">res/save.png</file>
        <file alias="edit_copy">assets/icons/16x16/edit-copy.png</file>
    </qresource>
</RCC>

.qrc 파일의 코드에서 살펴볼 사항

  • prefix
  • alias
  • 파일 경로

 

 

 

 

3. prefix란 무엇인가?

# 리소스파일.qrc

<qresource prefix="/icons">
    <file alias="save">icons/save.png</file>
    <file alias="edit_copy">assets/icons/16x16/edit-copy.png</file>

 

위와 같이 리소스 파일을 구현하면,

프로그래밍 과정에서 소스코드로 리소스 접근시

:/prefix/alias 
#:/접두사/별칭
:/icons/save
:/icons/edit_copy

명칭 만으로 프로젝트의 소스코드에서 사용할 수 있습니다.

 

 

그 외에 아래와 같은 사용상 장점이 있습니다.

  1. 리소스를 기능별로 깔끔하게 분류
  2. 서로 이름이 같은 파일도 충돌 없이 사용 가능
  3. 리소스 경로 체계를 만들 수 있음

 

3. 리소스 사용 예제

더보기

1. 프로젝트 구조

PythonProject1.zip
0.03MB
my_pyside6_app/
 ├── main.py
 ├── widget.py
 ├── res.qrc
 └── res/  # res 폴더 안에, 6개의 PNG 리소스 이미지를 넣어둔다고 가정합니다.
      ├── copy.png
      ├── cut.png
      ├── new.png
      ├── open.png
      ├── paste.png
      └── save.png

 

 

 

 

2. res.qrc 파일 작성

<RCC>
    <!-- prefix로 카테고리 묶기: /icons -->
    <qresource prefix="/icons">
        <file alias="new">res/new.png</file>
        <file alias="open">res/open.png</file>
        <file alias="save">res/save.png</file>
        <file alias="copy">res/copy.png</file>
        <file alias="cut">res/cut.png</file>
        <file alias="paste">res/paste.png</file>
    </qresource>
</RCC>

 

 

 

3. pyside6-rcc 명령으로 rc_icons.py 생성

pyside6-rcc res.qrc -o rc_icons.py
  • res.qrc → rc_icons.py 로 변환
  • 파이썬에서 import rc_icons 하는 순간 리소스가 등록
  • rc_icons.py 안에 아이콘이 바이너리로 포함
  • exe 하나로 배포해도 경로 걱정 없음

생성 후 구조:

my_pyside6_app/
 ├── main.py
 ├── widget.py
 ├── res.qrc
 ├── rc_icons.py ← ← ← ← 새로 생성
 └── res/
      └── ...6개 아이콘

 

 

 

 

 

 

4. widget.py – 리소스 사용하는 예제

# widget.py
from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton
from PySide6.QtGui import QIcon

import rc_icons  # <- 리소스 등록 (반드시 import 해야 함)

class MainWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("Qt Resource System 데모")

        layout = QHBoxLayout(self)

        btn_new = QPushButton("New")
        # btn_new.setIcon(QIcon(":/icons/new"))
        btn_new.setIcon(QIcon("C:/Dev/PythonProject1/res/new.png"))  # 절대 경로 사용 비교

        btn_open = QPushButton("Open")
        btn_open.setIcon(QIcon(":/icons/open")) # 리소스 사용 경로 비교

        layout.addWidget(btn_new)
        layout.addWidget(btn_open)
# main.py
import sys
from PySide6.QtWidgets import QApplication
from widget import MainWidget

def main():
    app = QApplication(sys.argv)
    w = MainWidget()
    w.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

 

 

 

 

5. 요약 

  1. 리소스 목록 파일(res.qrc) 작성
  2. pyside6-rcc(Resource Compiler)로 리소스 파일을 Python 파일로 변환
  3. Python 코드에서 사용
  4. exe로 배포할 때, 실행파일에 리소스 데이터가 포함됨

 

 

4. 리소스 사용 예제

더보기

1. 파이썬 프로젝트 생성

 

파이참에서 프로젝트 생성하기

1. 일반 프로젝트 생성하기더보기 2. 새 프로젝트 시작하기더보기Case A. 새 프로젝트 생성 Case B. 새 프로젝트 생성 Case C. 새 프로젝트 생성 3. 커스텀 가상환경으로 프로젝트 시작하기 더보기

basiclike.tistory.com

 

 

 

 

2. 리소스로 사용할 이미지 파일을, 프로젝트 경로의 res 폴더에 설정

res.zip
0.01MB

 

 

 

 

3. main.py, widget.py, res.qrc 파일 생성

 

 

 

 

4. res.qrc 파일 구현

<RCC>
    <!-- prefix로 카테고리 묶기: /icons -->
    <qresource prefix="/icons">
        <file alias="new">res/new.png</file>
        <file alias="open">res/open.png</file>
        <file alias="save">res/save.png</file>
        <file alias="copy">res/copy.png</file>
        <file alias="cut">res/cut.png</file>
        <file alias="paste">res/paste.png</file>
    </qresource>
</RCC>

 

 

 


 

5. pyside6-rcc 명령으로 rc_icons.py 생성

pyside6-rcc res.qrc -o rc_icons.py
  • res.qrc → rc_icons.py 로 변환

 

 

 

 

6. rc_icons.py 확인

 

 

 

 

 

7. widget.py 구현

# widget.py
from PySide6.QtWidgets import QWidget, QHBoxLayout, QPushButton
from PySide6.QtGui import QIcon

import rc_icons  # <- 리소스 등록 (반드시 import 해야 함)

class MainWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("Qt Resource System 데모")

        layout = QHBoxLayout(self)

        btn_new = QPushButton("New")
        # btn_new.setIcon(QIcon(":/icons/new"))
        btn_new.setIcon(QIcon("C:/Dev/PythonProject1/res/new.png"))  # 절대 경로 사용

        btn_open = QPushButton("Open")
        btn_open.setIcon(QIcon(":/icons/open")) # 리소스 경로 사용 비교

        layout.addWidget(btn_new)
        layout.addWidget(btn_open)

 

 

 

 

8. main.py 구현

# main.py
import sys
from PySide6.QtWidgets import QApplication
from widget import MainWidget

def main():
    app = QApplication(sys.argv)
    w = MainWidget()
    w.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

 

 

 

 

 

9. 실행