Здравствуйте. Мне тут понадобилось разобраться с расширениями для приложений Qt. Почитал доку, вроде понял что-то, решил сделать свой пример, и что-то не получается подгрузить расширение в приложение.
Интерфейс:
C++ (Qt)
#ifndef INTERFACE_H
#define INTERFACE_H
class Widget;
class INTERFACE
{
public:
virtual ~INTERFACE(){}
virtual void setupControl(Widget*) = 0;
};
Q_DECLARE_INTERFACE(INTERFACE, "com.interface.INTERFACE/1.0")
#endif
Вот код приложения, которое загружает плагины:
proC++ (Qt)
QT += core gui
TARGET = interface
TEMPLATE = app
SOURCES += main.cpp widget.cpp
HEADERS += widget.h
FORMS += widget.ui
hC++ (Qt)
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
};
#include <C:/interface.h>
#endif // WIDGET_H
cppC++ (Qt)
#include "widget.h"
#include "ui_widget.h"
#include <QPluginLoader>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QPluginLoader loader("C:\\extensions\\extension.dll");
INTERFACE *tmp = qobject_cast<INTERFACE*>(loader.instance());
if(tmp)
{
QMessageBox::information(this, "", "OK");
tmp->setupControl(this);
}
else
QMessageBox::critical(this, "", "ERROR");
}
Widget::~Widget()
{
delete ui;
}
Вот код расширения
proC++ (Qt)
QT += core gui
TEMPLATE = lib
CONFIG += plugin
CONFIG += release
TARGET = extension
SOURCES += win.cpp
HEADERS += win.h \
C:/interface.h
hC++ (Qt)
#ifndef WIN_H
#define WIN_H
#include <QObject>
#include <C:/interface.h>
#include <C:/Users/Anton/Desktop/interface/widget.h>
#include <QWidget>
class win: public QObject, public INTERFACE
{
Q_OBJECT
Q_INTERFACES(INTERFACE)
public:
virtual void setupControl(Widget*);
win();
private:
Widget * me;
};
#endif // WIN_H
cppC++ (Qt)
#include "win.h"
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include <QtPlugin>
win::win()
{
}
void win::setupControl(Widget *o)
{
me = o;
QHBoxLayout layout;
QPushButton w; QLabel l;
l.setText("Hello, Qt Extensions!");
w.setText("Exit");
connect(&w, SIGNAL(clicked()), me, SLOT(close()));
layout.addWidget(&l);
layout.addWidget(&w);
((QWidget*)me)->setLayout(&layout);
}
Q_EXPORT_PLUGIN2(INTERFACE, win)
скомпилил расширение - получил в релизе .dll и .a. Грузить пытаюсь DLL.
Если я правильно понимаю, то так на главном виджете окна должны появиться лейбл и кнопка, но что-то qobject_cast возвращает ноль...подскажите, где не прав.
Спасибо