Здравствуйте.
Помогите найти причину поведения программы с использованием плагинов: главное приложение при запуске загружает плагины из каталога и добавляет пункты меню для каждого из них. У каждого плагина есть функция, возвращающая QIcon. Но пункты меню получаются с одинаковым значком от первого плагина. Почему не меняется значок у второго и последующего пунктов меню? Что добавить/изменить?
Формирование меню в главном приложении:
#include <mod_interface.h>
void MainWindow::test()
{
QDir modulesDir( appFullPath + "modules" );
foreach( const QString& moduleName, modulesDir.entryList( QDir::Files ) ) {
QPluginLoader* loader = new QPluginLoader( modulesDir.absoluteFilePath( moduleName ) );
ModuleInterface* module = qobject_cast< ModuleInterface* >( loader->instance() );
// добавление пунктов меню, пока просто для тестирования:
ui->menu_Operations->addAction( module->moduleIcon(), // - тут иконка от плагина всегда одна и та же (от первого найденного) !!!!!
module->moduleText(), // - текст меняется как положено
this,
SLOT(slotModuleAction())
);
loader->unload();
}
}
Класс интерфейса в файле
mod_interface.hclass ModuleInterface {
public:
virtual ~ModuleInterface() {}
virtual QIcon moduleIcon() const = 0;
virtual QString moduleText() const = 0;
};
#define ModuleInterface_iid "ru.chronos.Application.ModuleInterface/1.0"
Q_DECLARE_INTERFACE( ModuleInterface, ModuleInterface_iid )
Пример плагина: файл
module.h#ifndef MODULE_H
#define MODULE_H
#include <mod_interface.h>
class Module: public QObject, public ModuleInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "ru.chronos.mod_opros.ModuleInterface")
Q_INTERFACES( ModuleInterface )
public:
~Module();
QIcon moduleIcon() const;
QString moduleText() const;
};
#endif // MODULE_H
файл
module.cpp#include "module.h"
Module::~Module()
{
}
QIcon Module::moduleIcon() const
{
// иконка содержится в ресурсах. у всех плагинов она своя.
return QIcon(":/res/mod_image.png");
}
QString Module::moduleText() const
{
return QString("test");
}
Qt 5.8, ОС Windows.