2014-10-20 4 views
9

Qt 애플리케이션에서 코드 파일이 아닌 리소스 (예 : 데이터 파일)를 패키지하는 방법은 리소스 시스템을 사용하고 있습니다. 그러나 비 Qt 함수를 사용하여 리소스에 액세스하려면 어떻게해야합니까? 예를 들어 ifstream을 사용하여 액세스하려는 일부 응용 프로그램 데이터가있는 .txt 또는 .csv 파일이있을 수 있습니다. Qt가 아닌 함수와 클래스의 경우 파일 이름 대신 ": ..."구문을 사용하는 것으로 작동하지 않는 것 같습니다. 앱에 비 Qt 함수가 사용하는 데이터를 패키징하기위한 별도의 워크 플로우가 있습니까?비 Qt 함수에서 Qt 리소스 데이터에 액세스하는 방법

저는 OSX를 사용하고 있지만 이러한 문제는 플랫폼에 독립적이라고 가정합니다.

+0

가능한 중복 [? 표준 : iostream과 Qfile을 사용하는 방법 (http://stackoverflow.com/questions/5204335/how-to- : 여기 당신이 그것을 사용하는 방법의 예입니다 – HostileFork

+0

Qt 리소스가 실행 파일 자체로 압축되기 때문에이 작업을 수행하는 유일한 방법은 파일을 임시 폴더에 추출하여 비 Qt 코드에서 사용할 수있는 유일한 방법입니다. – sjdowling

+0

Qt와 비 Qt 코드를 연결하는 함수 또는 클래스를 작성하십시오. 그런 다음 비 Qt 코드에서 해당 함수를 호출합니다 (해당 클래스의 메소드 호출). –

답변

4

Qt 리소스 시스템의 유일한 목적은 실행 파일 자체 내에 데이터를 묶는 것입니다. 실행 파일에 데이터를 통합하지 않으려면 리소스 시스템을 사용하지 않아야합니다. Mac에서

, 당신이 당신의 응용 프로그램 번들에 프로젝트 소스에서 "data.txt로"를 추가,하지만 실행 파일 자체에, 당신의 .pro 파일에 다음을 추가하고자하는 경우 : 위의 감안할 때

mac { 
    BUNDLE = $$OUT_PWD/$$TARGET$$quote(.app)/Contents 
    QMAKE_POST_LINK += ditto \"$$PWD/data.txt\" \"$$BUNDLE/Resources/\"; 
} 

을 프로젝트 파일, 파일을 얻기에 유용한 경로에 대한 QCoreApplication::applicationDirPath() 사용 : 위의 예에서

#include <QCoreApplication> 
#include <QFile> 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    qDebug() << QCoreApplication::applicationDirPath(); 
    QFile data(QCoreApplication::applicationDirPath() + "/../Resources/data.txt"); 
    if (data.open(QIODevice::ReadOnly | QIODevice::Text)) 
     qDebug() << data.readAll(); 
    return 0; 
} 

에게의 Resources 폴더는 Qt는 자원 정상적 복용으로 할 무관 여자 이름. OS X 응용 프로그램 번들의 이름 지정 규칙 일뿐입니다. 여기서는 Qt 리소스 시스템을 사용하지 않습니다.

Qt 리소스 시스템을 사용하고 QFile이 아닌 리소스 데이터에 직접 액세스하려는 경우 QResource 클래스는 실행 파일에 번들로 제공되는 리소스에 대한 액세스를 제공합니다.

컨트롤 아래의 코드가 데이터 입력에 ifstream을 사용하려고한다면 인위적으로 제한되며 수정해야합니다. 그 클래스는 반드시 파일 일 필요는 없지만 어떤 것으로도 백업 될 수 있으므로 istream을 사용해야합니다. 제어하지 않는 코드 인 경우 QLocalSocketifstream을 설정할 수 있습니다.

QResource::data()to an input stream을 스트림 버퍼를 통해 매핑 할 수 있습니다.

리소스 isCompressed() 인 경우 먼저 임시 영역으로 압축을 풀어야합니다. 압축 해제 단계를 피하기 위해 disable resource compression을 사용할 수도 있습니다. upx과 같은 전체 실행 가능한 압축기를 대신 사용할 수 있습니다. 코드가 실행될 때까지는 모든 압축이 해제되어 사용할 준비가됩니다.

+0

"도토"는 무슨 일을합니까? – daj

+0

@daj "ditto - 디렉토리 계층 구조 복사, 아카이브 생성 및 압축"OS X 사용자이므로 터미널에'man ditto '를 입력하면 문서를 볼 수 있습니다. –

1

RESOURCES = myResources.qrc과 같이 .pro 파일에 선언 한 경우 Qt는 큰 파일을 qrc_*.cpp으로 생성하고 실행 파일로 컴파일합니다. 따라서이 경우 Qt 앱에서만 액세스 할 수 있습니다. 당신이 자원 로딩 코드에 영향을 미칠 수있는 경우

그러나 당신은 자원을-에서 컴파일되지 않을 수 있지만

QResource::registerResource("/path/to/myResources.rcc") 

와 런타임에 명시 적으로로드하고 행복하게 일반 파일처럼 디스크에서 읽어 보시기 바랍니다.

+1

이 질문에 대답하지 않습니다. –

0

리소스 파일을 QFile 객체로 열고 이것을 QDataStream 객체로 랩핑하고 이것을 std :: basic_istream의 특성화에서 유래 한 boost :: iostreams :: stream 객체로 래핑하는 것은 어떻습니까? 복잡해 보이지만 너무 많은 코드 줄이 필요하지는 않습니다 (this answer 참조).

1

임시 폴더에 리소스 파일을 복사 할 수 있습니다. 이렇게하려면 QTemporaryDir을 사용하여 임시 폴더를 만들고 프로그램이 끝나면 자동으로 삭제합니다. 해당 폴더의 경로에 액세스하려면 QTemporaryDir::path() 메소드를 사용하십시오.

#include <QTemporaryDir> //You need to include this header 
QTemporaryDir temporaryDir; 
//Copy the resource file into the temporary folder 
QFile::copy(":/exampleprefix/examplefile.txt", temporaryDir.path() + "/examplefile.txt"); 
//Read the file 
std::ifstream fileStream(QString(temporaryDir.path() + "/examplefile.txt").toLatin1().data()); 
//etc 
관련 문제