在Qt插件类中读取自己的元数据

时间:2014-04-12 17:53:36

标签: c++ json qt qt5 qtcore

我目前正在编写自己的Qt插件,用于Qt程序。为了识别插件版本信息,我使用存储在JSON文件中的元数据,如下所示:

{
    "type" :            "communication",
    "name" :            "USB-LIN-IB",
    "longname" :        "USB-LIN Communication",
    "version" :         "1.1",
    "dependencies" :    []
}

要从插件类外部(在Qt程序世界中)访问这些元数据信息,我会依赖它们,因为我已经定义了这样的JSON文件:

Q_PLUGIN_METADATA(IID "org.plugins.communications.1" FILE "USBLINCommunication.json")

是否可以使用标准化且方便的方式从插件成员(例如插件构造函数)中访问完全相同的元数据? 当然,我可以使用QPluginLoader(我必须知道插件文件路径)或来自JSON对象的文件readAll。但是,这两种方法都依赖于知道插件和JSON文件的确切路径。这对我来说不太可靠。

我认为还有另一种更标准化的方法吗?

1 个答案:

答案 0 :(得分:6)

您无需知道QPluginLoader的绝对插件文件路径,因此您可以放心使用。

你可以直接传递插件名称,它会正常工作。它还将返回插件的完全限定文件名,如果您使用相应的方法读回文件名,则包括插件的完整路径。根据可以从QCoreApplication::libraryPaths()获得的信息,该课程将很清楚。

以下是the documentation的相应部分:

  

加载插件时,QPluginLoader会在当前目录和QCoreApplication :: libraryPaths()指定的所有插件位置中进行搜索,除非文件名具有绝对路径。成功加载插件后,fileName()返回插件的完全限定文件名,包括插件的完整路径(如果在构造函数中给出或传递给setFileName()。

因此,您基本上可以做的是:

myPluginLoader.metaData().value("MetaData").toObject().value("foo").toString()

其中foo可以是你上面提到的键之一。