C++ (Qt)class IPlugin{public: ... virtual void saveState() const = 0; virtual void restoreState() = 0; virtual void clear() = 0; ...};
class ICoreObject{public:// сохранение перманентно требуемого файла рядом с проектом virtual bool saveFile(const QString& file, const QByteArray& data) = 0;// сохранение данных в проектный файл virtual bool saveProject(const QByteArray& data) = 0;};
class CoreObject : public ICoreObject{public: CoreObject(const QString& plugin) : _plugin(plugin) {} QString plugin() const { return _plugin; }// сохранение перманентно требуемого файла рядом с проектом bool saveFile(const QString& file, const QByteArray& data);// сохранение данных в проектный файл bool saveProject(const QByteArray& data);private: QString _plugin;};
QString getPluginNameFromPath(const QString& path);void loadPlugins(const QStringList& pluginPaths){ foreach (QString pluginPath, pluginPaths) { QPluginLoader l(pluginPath); if (!l.load()) continue; Plugin* p = dynamic_cast<Plugin*>(l.instance()); if (p == 0) continue; QString plugin = getPluginNameFromPath(pluginPath); CoreObject* obj = new CoreObject(plugin); p->init(obj); _plugins.insert(plugin, p); _objects.insert(plugin, obj); }}QString getPluginNameFromPath(const QString& path){ QString result = QFileInfo(path).fileName();#ifdef Q_WS_WIN result.chop(4); // убираем с конца ".dll"#else#ifdef Q_WS_MAC result.chop(6); // убираем с конца ".dylib"#else result.chop(3); // убираем с конца ".so"#endif result = result.mid(3); // убираем с начала "lib"#endif return result;}