2017-05-03 11 views
0

우리는 다른 테마를 가진 응용 프로그램을 가지고 있습니다. 따라서 메인 앱에는 다음과 같은 것이 있습니다 :QResource : .rcc 파일 등록 취소

// User opens app with theme A 
QResource::registerResource("theme_a.rcc");  // returns TRUE 

// User changes theme to B 
QResource::unregisterResource("theme_a.rcc"); // returns TRUE 
QResource::registerResource("theme_b.rcc");  // returns TRUE 

모든 것이 주 응용 프로그램에서 잘 작동합니다. 이 소프트웨어가 다른 Qt 애플 리케이션을 호출 할 때 문제가 시작됩니다.

그 작은 응용 프로그램 안에 우리는 동일한 등록 절차를 따르고 등록을 취소합니다. 이상한 부분은 레지스터가 항상 작동하고 등록이 취소되지 않는다는 것입니다 (미성년자 앱에서만). 그런 일이 발생하고 있습니다.

// User opens app with theme A 
QResource::registerResource("minor_theme_a.rcc");  // returns TRUE 

// User changes theme to B 
QResource::unregisterResource("minor_theme_a.rcc"); // returns FALSE 
QResource::registerResource("minor_theme_b.rcc");  // returns TRUE 

왜 그런가요? 해결책이 있습니까?

답변

1

unregisterResource은 리소스가 성공적으로 언로드되면 true를 반환합니다. 리소스에 대한 참조가 없습니다.

그래서 귀하의 경우에는 다른 형식의 참조가 더있을 수 있습니다. unregisterResource에 대한

중요 문서 : 현재 등록되지 않은 파일에 관련 자료를 참조 QResources가있는 경우

, 그들은하지만, 리소스 파일 자체가 자원 뿌리에서 제거됩니다 계속 유효합니다 따라서이 자원 데이터를 가리키는 추가 QResource를 작성할 수 없습니다. 리소스를 가리키는 마지막 QResource가 소멸되면 리소스 자체가 메모리에서 매핑 해제됩니다.

그래서 내 강한 추측은 일부 QResource이 아직 등록을 시도한 것을 가리키고 있습니다.

+0

초보자 용 질문 일 수도 있지만, 일부 QResource가 등록하지 않은 것을 가리키는 것을 어떻게 알 수 있습니까? 내가 취하는 유일한 조치는 등록부를 호출하고 등록을 취소하는 것입니다. 나는 qResource 객체를 가지고 있지 않다. 정적 메소드를 호출한다. ... –

+1

보통 라이브러리가 참조 카운트를 반환 할 수 있는지를 알 수있다 .... 나는 조금 조사 할 것이다. – Naidu

+0

https : //code.woboq.org/qt5/qtbase/src/corelib/io/qresource.cpp.html .... unregisterResource의 구현을 볼 수 있습니다 .. 위의 링크에서 "QResource :: unregisterResource"를 검색하십시오 . 그들은 "QDynamicFileResourceRoot"를 사용하여 추가 참조에 대해 알고 있습니다. Qt가이 수준의 라이브러리 클래스를 노출한다고 생각하지 않습니다. 또는 필요가 없으면 등록을 등록하고 개수를 유지 관리하기위한 래퍼 클래스를 만들 수 있습니다. – Naidu