Qt 프레임워크의 Go언어용 바인딩인 therecipe/qt의 현재 버전[각주:1]에서 리소스를 이용할 때 유의할 만한 사항에 대해서 다룹니다.


0. 맥락 (배경지식)

Qt에서 일반적인 리소스 사용 과정은 다음과 같습니다.


  1. 크리에이터(Qt Creator)나 디자이너(Qt Designer)로 .qrc 파일을 입맛대로 편집합니다.

  2. 편집한 .qrc 파일을 rcc(리소스 컴파일러)로 컴파일하여 리소스가 구조체 형식으로 정의된 모듈을 얻습니다.
    - 원본 파일을 바이너리로 만드는 과정이라고 할 수 있습니다.

  3. rcc로 컴파일한 모듈을 프로그램에서 로드합니다.
    - 다시 말해 qRegisterResourceData() 함수가 호출됩니다.

  4. .qrc 파일에 정의된 프리픽스 주소 형식(접두사 경로)으로 리소스에 접근할 수 있습니다.
    - 주소 형식은 예를 들면 ":/myprefix/somefolder/whatevericon.png"처럼 생겼습니다.


1. qml 폴더

therecipe/qt는 프로젝트 폴더 아래에 이름을 qml로 하는 디렉토리를 두고 그 안에서 모든 리소스 관련 파일을 다룹니다. 또한 qml을 기본 접두어(Prefix)로 사용합니다.


- 리소스 컴파일러가 .qrc 파일을 qml 폴더에서 찾습니다.


- 리소스 컴파일시 모든 접두사가 qml로 변경됩니다.


- QUiLoader 클래스를 이용하여 동적으로 UI를 로드하는 경우에도 .ui 파일을 별도의 위치에서 검색하지 않고 qml 폴더만을 확인합니다.


2. 빌드 방법

qml 폴더 아래에 필요로 하는 모든 리소스 관련 파일과 디렉토리를 위치시키고 qtdeploy로 빌드하면 별도의 작업 없이도 필요한 모든 리소스와 함께 온전한 결과물이 컴파일됩니다. 소스 코드에서 리소스를 구조체로 정의하거나 로드하는 부분을 작성할 필요가 없습니다. qtdeploy 수행시에 qtrcc가 내부적으로 실행되면서 리소스를 C++ 모듈로 컴파일하고 최종 목표하는 프로그램에서 로드하도록 만들기 때문입니다.


- qml 폴더 아래에 .qrc 파일과 함께 필요로 하는 리소스 파일을 위치시킵니다. 리소스 파일은 임의의 하위 디렉토리에 위치할 수 있습니다.


- 리소스가 컴파일되는 과정에서 프로젝트 폴더 안에 다음과 같은 세 개의 파일이 생성되는데 빌드 완료 뒤에는 모두 삭제해도 문제 없습니다. rcc.cpp에 리소스의 바이너리가 정의됩니다. rcc.qrc는 접두어가 qml로 변경된 리소스 파일입니다.

rcc.cpp

rcc.qrc

rcc_cgo_windows_windows_amd64.go



3. 접두어

리소스는 컴파일시 접두사가 qml로 변경되는데 이는 개발중인 프로그램의 소스 코드에서 리소스를 접근하기 위해서 사용하는 경로의 접두사가 qml로 강제된다는 것을 의미합니다. 이 때문에 .qrc 파일에서 사용하는 접두사(Prefix)는 qml 하나만 두는 것이 좋습니다. 그렇게 하면 uic를 사용하는 경우에 편리합니다.


  1. commit 491342284b02f5b27d5a19d030e5e446727b464d https://github.com/therecipe/qt/commit/491342284b02f5b27d5a19d030e5e446727b464d [본문으로]
Top