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

标签 c++ qt runtime qt-designer qresource

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

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

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

但是它返回了一个错误。

我的下一次尝试是使用 Q_CLEANUP_RESOURCE(widgetbox) , 但它扩展到的功能仅在 Qt Designer (QDesignerComponents) 的私有(private)组件中可用。

另一种尝试是清除文件的内容,但它是只读的:

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我将解释整个上下文:我通过对独立的 IDE 进行小的调整,将 Qt Designer 集成到我自己的 IDE 中。基本上,我添加了一个编译标志来生成动态库而不是可执行文件,并添加了一些选项来显示主窗口。

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

我有一个选择是将该负载设为可选,但它会在许多项目中产生一连串的变化。我想避免过多地修改 Qt Designer。

最佳答案

您已经在使用 Qt Designer,所以首先您应该将它包含在您的构建中,其次您将可以访问它的所有类 - 不再有“私有(private)”组件这样的东西,它是您的 现在编码。让它为你工作!

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

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

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

关于c++ - 在运行时删除/修改静态 Qt 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46427908/

相关文章:

c++ - 任何 C++ 98 标准容器操作都可以抛出 std::bad_alloc 吗?

c++ - 多个 "level"派生抽象类

qt - Qt5 中的 QX11EmbedContainer 替代方案

c++ - 如何在 64 位 Linux Mint 上构建最小静态 Qt 5.2 32 位库?

linker - 运行时链接器忽略 Solaris 上可执行文件中的 RPATH

c++ - 使用正态分布优化预期 yield

c++ - 是否有与 shared_from_this 等效的 weak_ptr?

c++ - QT的opengl问题

Java运行时执行

从 netbeans 和 cmd 运行的 Java 区别