Чтение собственных метаданных в классе плагинов QT
Вопрос
Я в настоящее время пишу свой собственный плагин 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.Однако оба метода полагаются на знание точного пути плагина и файла JSON.Это не очень надежно для меня.
Я думал, что есть еще один стандартизированный путь?
Решение
Вам не нужно знать абсолютный пункт файла плагинов для QPluginLoader
, поэтому вы будете в безопасности.
Вы можете просто пройти имя плагина, и он будет работать нормально. Он также вернет полностью квалифицированное имя файла плагина, включая полный путь к плагину, если вы читаете имя файла обратно с соответствующим методом. Для класса будет ясно, на основании информации, которая может быть получена из QCoreApplication::libraryPaths()
.
Вот соответствующая часть Документация :
При загрузке плагина QPlugInloader поиск в текущем каталоге и во всех местах плагина, указанные в QCOREAPLICALICATIONAL :: liblicPaths (), если имя файла не имеет абсолютного пути. После успешного загрузки плагина имени файла () возвращает полностью квалифицированное имя файла плагина, включая полный путь к плагину, если он был приведен в конструкторе или передан на SetFileName ().
Следовательно, что вы могли бы сделать в основном, это:
myPluginLoader.metaData().value("MetaData").toObject().value("foo").toString()
.
Где foo может быть одним из вышеупомянутых клавиш.