2017-09-26 107 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。 –