在运行时删除/修改静态Qt资源

时间:2017-09-26 13:29:23

标签: c++ qt runtime qt-designer qresource

作为Qt Designer黑客的一部分,我对在运行时删除资源感兴趣(特别是:/trolltech/widgetbox/widgetbox.xml)。有关上下文的更多详细信息,请参阅帖子的结尾。

我明显(并且失败)的尝试是:

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 Designer集成到我自己的IDE中。基本上,我添加了一个编译标志来生成动态库而不是可执行文件,并添加了一些选项来公开主窗口。

在此IDE中,我想添加一个选项,以避免用户使用默认窗口小部件并将列表限制为一组自定义窗口小部件。我提到的资源是默认情况下包含Qt Designer中可用小部件列表的文件。可以通过插件轻松添加其他小部件,但我还没有找到删除默认小部件的方法。

我有一个选择是使该加载可选,但它会通过许多项目产生一连串的变化。我想避免这么多修改Qt Designer。

1 个答案:

答案 0 :(得分:3)

你已经在使用Qt Designer,所以首先你应该把它包含在你的构建中,其次你可以访问它的所有类 - 没有像#34; private&#34;组件,它现在你的代码。让它适合你!

Qt资源可以在单独的二进制文件中编译或生成。您可以将此资源放入单独的二进制文件中,然后通过registerResource / unregisterResource轻松加载和卸载它。

QFile使用基于QAbstractFileEngine的虚拟文件系统。 QAbstractFileEngineHandler::create的实现充当过滤器,可以捕获请求并让文件引擎根据需要处理它。例如。您的文件引擎可能在打开时失败 - 这相当于删除资源。

请注意,自Qt 5以来,QAbstractFileEngine不再公开,大概是Qt人正在考虑用其他东西替换它。要使用这些API,您需要将qt += core-private添加到项目的qmake文件中。

相关问题