2017-09-26 74 views
0

作爲Qt設計器黑客攻擊的一部分,我對運行時刪除資源感興趣(特別是:/trolltech/widgetbox/widgetbox.xml)。有關上下文的更多詳細信息,請參閱帖子的末尾。在運行時去除/修改靜態Qt資源

我明顯的(和失敗)的嘗試是:

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

但它返回一個錯誤。

我的下一個嘗試是使用Q_CLEANUP_RESOURCE(widgetbox),但擴展到的功能僅在Qt Designer(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我將解釋整個來龍去脈:我整合Qt設計到我自己的IDE通過使小的調整,以獨立的一個。基本上,我添加了一個編譯標誌來生成動態庫而不是可執行文件,並添加了一些選項來顯示主窗口。

在此IDE中,我想添加一個選項以避免用戶使用默認窗口小部件並將列表限制爲一組自定義窗口。我提到的資源是默認情況下包含Qt Designer中可用的小部件列表的文件。其他小部件可以通過插件輕鬆包含,但是我還沒有找到刪除默認小部件的方法。

我的一個選擇是使該加載可選,但它會通過許多項目產生級聯的變化。我想避免修改Qt設計器。

回答

3

您正在使用Qt設計了,所以首先你應該包括在你的構建,其次,你將有機會獲得它的所有類的 - 沒有這樣的事,作爲一個「私人」部分了,這是現在編碼。讓它爲你工作!

Qt資源可以編譯或生成在一個單獨的二進制文件中。您可以將此資源放入單獨的二進制文件,然後通過registerResource/unregisterResource輕鬆裝載和卸載。

QFile使用基於QAbstractFileEngine的虛擬文件系統。 QAbstractFileEngineHandler::create的實現起到了一個過濾器的作用,可以捕獲請求並讓文件引擎根據需要處理它。例如。您的文件引擎可能只會在打開時失敗 - 這相當於刪除資源。

請注意,自Qt 5以來QAbstractFileEngine已不再公開,Qt人員正在考慮用其他東西替換它。要使用這些API,您需要將qt += core-private添加到項目的qmake文件中。

+0

Thanks @ kuba-ober!我會看看文件引擎和'registerResource',它會花費我一些時間來測試,但我會告訴你! – cbuchart

+0

順便說一下,關於修改,客戶希望能夠遷移到Qt_的未來版本,所以我想盡可能快地趕上更新版本的Qt以減少工作量。 – cbuchart

+2

您可以設置一個專用的git源代碼庫來跟蹤qt基礎庫的設計器文件夾。使用[稀疏結帳](https://stackoverflow.com/questions/4114887/is-it-possible-to-do-a-sparse-checkout-without-checking-out-the-whole-repository)和淺拉只拉所需的代碼。然後將您的更改添加到存儲庫。當需要升級到更新的Qt版本時,重新分配你的分支。您可能會遇到一些衝突,但這些衝突只會在Qt代碼和代碼更改重疊的情況下發生。您可以將該項目添加爲項目的git倉庫的子模塊。沒有git = SOL。 –