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

C++ 在Qt插件类中读取自己的元数据,c++,json,qt,qt5,qtcore,C++,Json,Qt,Qt5,Qtcore,我目前正在编写自己的Qt插件,用于Qt程序。为了识别插件版本信息,我使用存储在JSON文件中的元数据,如下所示: { "type" : "communication", "name" : "USB-LIN-IB", "longname" : "USB-LIN Communication", "version" : "1.1", "dependencies" : [] } 要从

我目前正在编写自己的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文件的确切路径。这对我来说不太可靠


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

您不需要知道
QPluginLoader
的绝对插件文件路径,这样您就安全了

您只需传递插件名称,它就可以正常工作。它还将返回插件的完全限定文件名,包括插件的完整路径(如果您使用相应的方法读取文件名)。基于可从
QCoreApplication::libraryPaths()
获得的信息,类将变得清晰

以下是相应的部分:

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

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

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

其中foo可以是前面提到的任意一个键。

我初始化QPluginLoader实例的最佳解决方法是:在插件的pro文件中,添加行
DEFINES+=BUILD\u NAME=\\\\\“$$${TARGET}\\\”
,然后在构造函数类中添加行
QPluginLoader*myPluginLoader=new QPluginLoader>(构建名称);
…完成