crossplatform.ru

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


  Ответ в Qt и динамически подклюемые плагины
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
edwardoid Дата 30.10.2009, 15:35
  Господа, у меня проблема. Почему-то под моей убунтой не могу сделать плагин для своей программы, выкладываю куски кода код:

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


Сама проблема в том, что плагин не загружается, т.е. вектор пустой.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 19:38