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