crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Qt и динамически подклюемые плагины
edwardoid
  опции профиля:
сообщение 30.10.2009, 15:35
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

Спасибо сказали: 0 раз(а)




Репутация:   0  


Господа, у меня проблема. Почему-то под моей убунтой не могу сделать плагин для своей программы, выкладываю куски кода код:

main.cpp (мне надо чтобы плагины по мере загрузки давали о себе знать в QSplashScreen)
QVector<QObject*>* loadPlugins(QSplashScreen *splash)
{
    QVector<QObject*> *pluginsLoaded = new QVector<QObject*>;
    QDir pluginsDir(qApp->applicationDirPath());
    #if defined(Q_OS_WIN)
     if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
         pluginsDir.cdUp();
    #elif defined(Q_OS_MAC)
     if (pluginsDir.dirName() == "MacOS") {
         pluginsDir.cdUp();
         pluginsDir.cdUp();
         pluginsDir.cdUp();
     }
    #endif
    pluginsDir.cd("plugins");

    foreach(QString filename, pluginsDir.entryList(QDir::Files))
    {
        QPluginLoader loader(pluginsDir.absoluteFilePath(filename));
        QObject *plugin = loader.instance();
        if(plugin)
        {
            qDebug(filename.toStdString().c_str());
            splash->showMessage(filename.append(" loaded!"));
            QMessageBox::information(0, "plugin", filename);
            pluginsLoaded->push_back(plugin);
        }
        QMessageBox::information(0,"..",QString::number(pluginsLoaded->size()));
    }
    return pluginsLoaded;
}


plugininterfaces.h
#ifndef PLUGININTERFACES_H
#define PLUGININTERFACES_H
#include <QtPlugin>
#include <QtGui>

class Plugin
{
public:
    virtual ~Plugin(){}
    virtual QWidget* prevWidget() =0;
public slots:
    virtual void settings()=0;
signals:
    virtual void notify(QString , QIcon* = 0) = 0;
};

Q_DECLARE_INTERFACE(Plugin,"SSC.BlackRabbit.Plugin/1.0")



#endif // PLUGININTERFACES_H


sampleplugin.h // Preview - отдельный класс естественно
#ifndef SAMPLEPLUGIN_H
#define SAMPLEPLUGIN_H
#include "../../plugininterfaces.h"


class SamplePlugin: public QObject, public Plugin
{
    Q_OBJECT
    Q_INTERFACES(Plugin)
public:
    SamplePlugin();
    ~SamplePlugin();
    QWidget* prevWidget();
public slots:
    void settings();
    signals:
    void notify(QString, QIcon* =0);
private:
    QWidget *prev;
};

#endif // SAMPLEPLUGIN_H


sampleplugin.cpp
#include "sampleplugin.h"
#include "preview.h"

SamplePlugin::SamplePlugin()
{
    prev = 0;
}

SamplePlugin::~SamplePlugin()
{
    if(prev!=0)
        delete prev;
}

QWidget* SamplePlugin::prevWidget()
{
    if(prev!=0)
        delete prev;
    prev = new Preview(0);
    return prev;
}

Q_EXPORT_PLUGIN2(plugin, SamplePlugin)

SamplePlugin.pro
TEMPLATE = lib
CONFIG += plugin
HEADERS += sampleplugin.h \
    preview.h
SOURCES += sampleplugin.cpp \
    preview.cpp
DESTDIR = ../../plugins
FORMS += preview.ui


Сама проблема в том, что плагин не загружается, т.е. вектор пустой.

Сообщение отредактировал Litkevich Yuriy - 30.10.2009, 17:03
Причина редактирования: вместо тэга codebox используй code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.9.2019, 23:49