Russian Qt Forum
Ноябрь 24, 2024, 08:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с получением QIcon из плагина (решено).  (Прочитано 2053 раз)
nayk
Гость
« : Март 30, 2017, 08:10 »

Здравствуйте.
Помогите найти причину поведения программы с использованием плагинов: главное приложение при запуске загружает плагины из каталога и добавляет пункты меню для каждого из них. У каждого плагина есть функция, возвращающая 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.h
Код:
class 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.
« Последнее редактирование: Март 30, 2017, 09:02 от nayk » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Март 30, 2017, 08:28 »

Не имеет ли иконка одинаковое название?

Код
C++ (Qt)
return QIcon(":/res/mod_image.png");
 

Ресурсы в приложении общие, и одинаковое название - одна и та же иконка.
Записан
nayk
Гость
« Ответ #2 : Март 30, 2017, 09:01 »

Действительно, этот момент я пропустил. Изменил название - все заработало.
Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.173 секунд. Запросов: 22.