LINUX.ORG.RU

магический IID в Qt

 , , ,


2

5

Доброго времени суток. При написании собстенного плагина для приложения, с использованием интерфейса, необходимо 2 макроса: Q_DECLARE_INTERFACE(<name> <IID>) и Q_PLUGIN_METADATA(IID <IID> FILE <file.json>) - для интерфейса и плагина соответственно. Причем, если собирать плагин с отличным IID от IID интерфейса, то экспортируется он нормально. НО если писать плагин для Qt, скажем, реализуя QStylePlugin, то объявление кастомного IID для макроса Q_DECLARE_INTERFACE является ошибкой. Плагин начинает работать толкько с IID QFactoryInterface'a. Почему такие различия?


В общем, покапался на форумах, и, судя по всему, перед использованием плагина (основанного на QStylePlugin) Qt сверяет заранее заданный идентификатор интерфейса, на котором он базируется, и идентификатор самого плагина. Вероятно, это происходит где то в QStyleFactory::create путем вызова определения специализации шаблона qobject_interface_iid, которая генерируется в макросе Q_DECLARE_INTERFACE (сам шаблон объявляется в qobject.h), и использования метаинформации, которой владеет QPluginLoader (IID плагина можно получить с помощью функции QJsonObject::value c ключем «IID»). Особое внимание таким вещам в официальной документации, похоже, не уделяется, а жаль. Оставлю это здесь, вдруг кому-то тоже станет интересно

Rot1 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.