Russian Qt Forum

Qt => Общие вопросы => Тема начата: G-virus от Июнь 27, 2012, 21:56



Название: [РЕШЕНО]QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: G-virus от Июнь 27, 2012, 21:56
Здравствуйте. Мне тут понадобилось разобраться с расширениями для приложений 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
 

Вот код приложения, которое загружает плагины:
pro
Код
C++ (Qt)
QT       += core gui
TARGET = interface
TEMPLATE = app
SOURCES += main.cpp     widget.cpp
HEADERS  += widget.h
FORMS    += widget.ui
 
h
Код
C++ (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
 
cpp
Код
C++ (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;
}
 

Вот код расширения
pro
Код
C++ (Qt)
QT += core gui
TEMPLATE = lib
CONFIG += plugin
CONFIG += release
TARGET = extension
SOURCES += win.cpp
HEADERS += win.h \
            C:/interface.h
 
h
Код
C++ (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
 
cpp
Код
C++ (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 возвращает ноль...подскажите, где не прав.

Спасибо


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: alexis031182 от Июнь 27, 2012, 22:29
А dll-ка точно в "C:\extensions\" находится?


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: G-virus от Июнь 27, 2012, 22:51
А dll-ка точно в "C:\extensions\" находится?

ну да


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: RomiX от Июнь 29, 2012, 18:30
а что у вас выдаёт loader.errorString() ?
у меня пишет <filename> is not a valid Qt plugin. всё что смог найти, это то что дллка плагина не может найти другие библиотеки, у меня их было всего 5, все скопировал в одну папку, туда же плагин и прогу для проверки - нифига((
upd: забыл про Q_EXPORT_PLUGIN2, теперь всё работает) сам удивился! много раз пробовал - не получалось...


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: G-virus от Июнь 29, 2012, 23:16
а что у вас выдаёт loader.errorString() ?
у меня пишет <filename> is not a valid Qt plugin. всё что смог найти, это то что дллка плагина не может найти другие библиотеки, у меня их было всего 5, все скопировал в одну папку, туда же плагин и прогу для проверки - нифига((
upd: забыл про Q_EXPORT_PLUGIN2, теперь всё работает) сам удивился! много раз пробовал - не получалось...

loader.errorString() выдал вот это

(http://dl.dropbox.com/u/6052533/Screens/25727d0.jpg)

Если честно, немного не понимаю...сам плагин откомпилил в релизе, не понимаю ошибки..

Откомпилил и то и то в релизе, мэсседжбокс показал ОК, но кнопок и прочего не появилось на формочке все равно...


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: RomiX от Июнь 30, 2012, 22:18
тогда фиг его знает, я пока ограничился функций которая просто вовращает строку, вернула. а виджет пробовал экспортировать в динамическую библиотеку, работало нормально


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: RomiX от Июнь 30, 2012, 23:25
по-моему я понял почему форма пустая: у вас в void win::setupControl(Widget *o) виджеты - локальные переменные, и при выходе из функции они уничтожаються, нужно создавать через new


Название: Re: QPluginLoader. не могу разобраться, помогите, пожалуйста
Отправлено: G-virus от Июль 01, 2012, 13:40
по-моему я понял почему форма пустая: у вас в void win::setupControl(Widget *o) виджеты - локальные переменные, и при выходе из функции они уничтожаються, нужно создавать через new

Да, Вы абсолютно правы, я тупанул насчет локальности переменных =_= Спасибо