2017-05-03 42 views
0

我們有一個應用程序與多個主題,其中調用其他次要應用程序。所以,在主應用程序有這樣的事情:QResource:unregister .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