Russian Qt Forum
Ноябрь 24, 2024, 02:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО]QPluginLoader. не могу разобраться, помогите, пожалуйста  (Прочитано 6518 раз)
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 возвращает ноль...подскажите, где не прав.

Спасибо
« Последнее редактирование: Июль 01, 2012, 13:41 от G-virus » Записан
alexis031182
Гость
« Ответ #1 : Июнь 27, 2012, 22:29 »

А dll-ка точно в "C:\extensions\" находится?
Записан
G-virus
Гость
« Ответ #2 : Июнь 27, 2012, 22:51 »

А dll-ка точно в "C:\extensions\" находится?

ну да
Записан
RomiX
Гость
« Ответ #3 : Июнь 29, 2012, 18:30 »

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

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

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



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

Откомпилил и то и то в релизе, мэсседжбокс показал ОК, но кнопок и прочего не появилось на формочке все равно...
« Последнее редактирование: Июнь 29, 2012, 23:20 от G-virus » Записан
RomiX
Гость
« Ответ #5 : Июнь 30, 2012, 22:18 »

тогда фиг его знает, я пока ограничился функций которая просто вовращает строку, вернула. а виджет пробовал экспортировать в динамическую библиотеку, работало нормально
Записан
RomiX
Гость
« Ответ #6 : Июнь 30, 2012, 23:25 »

по-моему я понял почему форма пустая: у вас в void win::setupControl(Widget *o) виджеты - локальные переменные, и при выходе из функции они уничтожаються, нужно создавать через new
Записан
G-virus
Гость
« Ответ #7 : Июль 01, 2012, 13:40 »

по-моему я понял почему форма пустая: у вас в void win::setupControl(Widget *o) виджеты - локальные переменные, и при выходе из функции они уничтожаються, нужно создавать через new

Да, Вы абсолютно правы, я тупанул насчет локальности переменных =_= Спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.183 секунд. Запросов: 21.