2017-09-26 11 views
0

Qt 디자이너 해킹의 일환으로 런타임 (특히 :/trolltech/widgetbox/widgetbox.xml)에서 리소스를 제거하는 데 관심이 있습니다. 컨텍스트에 대한 자세한 내용은 게시물의 끝 부분을 참조하십시오.런타임에 정적 Qt 리소스 제거/수정

내 분명한 (실패) 시도했다 :

QFile(":/trolltech/widgetbox/widgetbox.xml").remove(); 

하지만 오류를 반환했습니다.

내 다음 시도는 Q_CLEANUP_RESOURCE(widgetbox)을 사용했지만 확장 된 기능은 Qt 디자이너 (QDesignerComponents)의 개인 구성 요소에서만 사용할 수 있습니다.

또 다른 시도

는 파일의 내용을 취소했지만, 읽기 전용 :

QFile f(":/trolltech/widgetbox/widgetbox.xml"); 
if (f.open(QFile::WriteOnly)) { ... } // returns false 

나는 또한 내 자신의 :/trolltech/widgetbox/widgetbox.xml을 정의하여 Qt는 자원의 파일 시스템에 덮어 쓰기를 시도했습니다. 파일을 열 수는 있지만 데이터를 검색하지 못합니다. 중복 된 리소스 (사용되지 않는 이름의 리소스를 별칭으로 지정하면 응용 프로그램이 내용을 올바르게 인쇄 할 수 있기 때문입니다). 반면 위젯 목록은 올바르게 표시됩니다.

QFile f(":/trolltech/widgetbox/widgetbox.xml"); 
if (f.open(QFile::ReadOnly)) { 
    qDebug() << "{"; 
    qDebug() << f.readAll(); // shows nothing 
    qDebug() << "}"; 
} 

런타임에 리소스 파일을 수정/제거/바꿀 수있는 방법이 있습니까? 경우


당신이 XY problem 내가 전체 맥락을 설명 할 것이다 고려 : 나는 독립 한 작은 비틀기를 만들어 내 자신의 IDE에 Qt는 디자이너를 통합하고있다. 기본적으로 실행 파일 대신 동적 라이브러리를 생성하는 컴파일 플래그를 추가하고 기본 창을 표시하는 옵션을 추가했습니다.

이 IDE에서는 사용자가 기본 위젯을 사용하고 목록을 사용자 정의 위젯 세트로 제한하지 못하게하는 옵션을 추가하려고합니다. 내가 언급 한 리소스는 기본적으로 Qt Designer에서 사용할 수있는 위젯 목록이 들어있는 파일입니다. 추가 위젯은 플러그인을 통해 쉽게 포함될 수 있지만 기본 위젯을 제거하는 방법을 찾지 못했습니다.

하나의 옵션은로드를 선택적으로 만드는 것이지만 많은 프로젝트를 통해 변경 사항이 연속적으로 생성됩니다. 나는 Qt 디자이너를 너무 많이 수정하는 것을 피하고 싶다.

답변

3

Qt Designer를 이미 사용하고 있으므로 먼저 빌드에 포함시켜야하며 두 번째로 모든 클래스에 액세스 할 수 있습니다. 더 이상 "개인"구성 요소가 없으며 입니다. 지금 코드. 그것을 당신을 위해 일하게하십시오!

Qt 리소스를 컴파일하거나 별도의 바이너리로 생성 할 수 있습니다. 이 리소스를 별도의 바이너리에 넣은 다음 registerResource/unregisterResource을 통해 쉽게로드하고 언로드 할 수 있습니다.

QFileQAbstractFileEngine을 기반으로하는 가상 파일 시스템을 사용합니다. QAbstractFileEngineHandler::create의 구현은 필터 역할을하며 요청을 잡아 원한다면 파일 엔진이 처리하도록 할 수 있습니다. 예 : 파일 엔진이 열렸을 때 단순히 실패 할 수 있습니다. 이는 리소스를 삭제하는 것과 같습니다.

Qt 5 이후 QAbstractFileEngine은 더 이상 공개되지 않으며 아마도 Qt 사람들은 다른 것으로 교체하려고합니다. 이 API를 사용하려면 qt += core-private을 프로젝트의 qmake 파일에 추가해야합니다.

+0

감사합니다. @ kuba-ober! 파일 엔진과'registerResource'를 살펴 보겠습니다. 시험 할 시간이 걸릴 것입니다. 그러나 알려 드리겠습니다! – cbuchart

+0

BTW, 수정에 관해서는 클라이언트가 Qt_의 향후 버전으로 마이그레이션 할 수 있기를 원하므로 가능한 한 빨리 Qt의 최신 버전을 따라 잡기 위해 수행되는 작업량을 줄이고 싶습니다. . – cbuchart

+2

Qt 기본 저장소의 디자이너 폴더를 추적하는 전용 git 소스 저장소를 설정할 수 있습니다. [스파 스 체크 아웃] (https://stackoverflow.com/questions/4114887/is-it-possible-to-do-a-sparse-checkout-without-checking-out-the-whole-repository)을 사용하고 얕은 필요한 코드 만 가져 오십시오. 그런 다음 변경 사항을 저장소에 추가하십시오. 새로운 Qt 버전으로 업그레이드 할 때 지점을 리베이스하십시오. 약간의 충돌이있을 수 있지만, Qt 코드와 코드 변경이 중복되는 부분에만 적용됩니다. 해당 프로젝트를 프로젝트의 git repo에 하위 모듈로 추가 할 수 있습니다. 아니 자식 = SOL. –