Russian Qt Forum

Qt => Общие вопросы => Тема начата: Tam-Tam от Октябрь 11, 2007, 00:57



Название: Создание динамической библиотеки (DLL)
Отправлено: Tam-Tam от Октябрь 11, 2007, 00:57
Помогите разобраться с плагинами.
Задача следующая. Есть производный класс от QWidget(допустим с названием MyClass). Кроме создание самого QWidget в его конструкторе с помощью менеджеров компоновок размещаются на созданном QWidget QPushButton, QLineEdit и QLabel. Так же добавляются несколько слотов и сигналов. В результате получается некий диалог с простенькой функциональностью. Дальше создавая экземпляр класса (MyClass *my = new ...) используем как обычный виджет. Требуется запихнуть этот класс в библиотеку и динамически ее распаковать что бы можно было так же создать (MyClass *my = new ...) и использовать класс. Примеры идущие с мануалом Qt не подходят поскольку там классы не наследуются. При попытке сделать по такому же образу столкнулся с проблемой что ни один из методов наследуемого класса после распаковки не виден. Не говоря уже о конструкторе на который компилятор ругается(поскольку отказывается принимать виртуальный конструктор).
Помогите с хедерфайлом интерфейса класса и части кода где библиотека распаковывается и создается экземпляр класса. Буду безмерно рад любым примерам. Если сильно лень писать код, опишите хотя бы словами.


Название: Re: Плагины
Отправлено: pastor от Октябрь 11, 2007, 01:14
Вам нужно создать динамическую либу или плагин к Qt дизайнеру?


Название: Re: Плагины
Отправлено: vregess от Октябрь 11, 2007, 07:22
Если нужно наследование, то, по-видимому, целью является динамическая библиотека...
Может поможет : http://prog.org.ru/forum/index.php/topic,6209.0.html


Название: Re: Плагины
Отправлено: Tam-Tam от Октябрь 11, 2007, 07:50
Вам нужно создать динамическую либу или плагин к Qt дизайнеру?
Динамическую

Если нужно наследование, то, по-видимому, целью является динамическая библиотека...
Может поможет : http://prog.org.ru/forum/index.php/topic,6209.0.html
Вроде именно то что нужно. Можешь дать исходники своей либы из той темы ? Ты там указывал что есть еще одна либа которая нормально собирается. Ее тоже если можешь дай.


Название: Re: Плагины
Отправлено: vregess от Октябрь 11, 2007, 08:58
Ты там указывал что есть еще одна либа которая нормально собирается.
Я наврал)
Собирается-то она собирается, но когда тащишь из нее классы - облом.

Можешь дать исходники своей либы из той темы?

Накидаю тебе по-позже (ща занят) пример простой библиотеки, тебе так легче будет.
Куда кидать?
Ну или если желаешь - кину свою либу... Выбирай.


Название: Re: Плагины
Отправлено: Tam-Tam от Октябрь 11, 2007, 11:01
Накидаю тебе по-позже (ща занят) пример простой библиотеки, тебе так легче будет.
Куда кидать?
Ну или если желаешь - кину свою либу... Выбирай.

Можно и попозже. Небольшой пример распаковки, если не сложно, тоже напиши.
Скинь все что есть по данной теме.
garka.com[собака]mail.ru


Название: Re: Плагины
Отправлено: ритт от Октябрь 11, 2007, 17:20
какой компилятор? если собираете на вс и методы/классы из либы не видны, могу предположить, что класс не помечен на импорт/экспорт (либо неправильно помечен). если есть время, можее полистать код модуля гуи кутэ - там ведь такая же точно задача для виджетов.

я так же точно использую некоторые диалоги из плагинов - всё замечательно наследуется, если не забывать про порядок импорта/экспорта :)


Название: Re: Плагины
Отправлено: Tam-Tam от Октябрь 11, 2007, 19:52
я так же точно использую некоторые диалоги из плагинов - всё замечательно наследуется, если не забывать про порядок импорта/экспорта :)

Я безумно рад что у тебя пашет. Сделай теперь так что б и у меня пахало ) Поделись примером хоть одним.


Название: Re: Плагины
Отправлено: ритт от Октябрь 11, 2007, 20:36
как фамильярно

в либе:
Код:
#include <QtGlobal>

#ifdef Q_OS_WIN
#ifdef LIB_BUILD
#define LIB_EXPORT Q_DECL_EXPORT
#else
#define LIB_EXPORT Q_DECL_IMPORT
#endif
#endif
#ifndef LIB_EXPORT
#define LIB_EXPORT
#endif

class LIB_EXPORT SomeDialog : public QDialog
{
Q_OBJECT

public:
SomeDialog(const QString& text, QObject* parent = 0);
virtual ~SomeDialog();

QString title() const;

signals:
void titleChanged(const QString& title);

public slots:
void setTitle(const QString& text);
}

затем соответствующая набивка в майдиалог.цпп

собираем с дефайном LIB_BUILD

затем в программе (считаем, что либу выше подлинковали на этапе сборки или ран-тайм)
Код:
//...

SomeDialog* dialog = new SomeDialog("мой диалог", this);

//...

собираем без дефайна LIB_BUILD


Название: Re: Плагины
Отправлено: Tam-Tam от Октябрь 11, 2007, 23:54
Огромное спасибо

Что изменится если будет другая ОС ? Дефайны поменяются ?
Дай пожалуйста еще тот маленький кусочек кода, где либа динамически подлинковывается.


Название: Re: Плагины
Отправлено: ритт от Октябрь 12, 2007, 00:00
говорим "ос", подразумеваем "компилятор"
для НЕвенды Q_DECL_EXPORT и Q_DECL_IMPORT станут пустыми и ничего не случится

> динамически подлинковывается
то есть, ран-тайм? смотри ассистант на предмет "как делать плагины"
не хочешь плагинами, смотри там же QLibrary*


Название: Re: Плагины
Отправлено: Tam-Tam от Октябрь 12, 2007, 00:50
то есть, ран-тайм? смотри ассистант на предмет "как делать плагины"
не хочешь плагинами, смотри там же QLibrary*

Я плагином изначально и пытался сделать. Ничего из этого не вышло.


Название: Re: Плагины
Отправлено: ритт от Октябрь 12, 2007, 02:14
а что именно не вышло? создать плагин? подключить плагин? создать сущность класса, описание которого хранится в плагине?



Название: Re: Плагины
Отправлено: Tam-Tam от Октябрь 12, 2007, 08:12
Отправил примеры на garka.com[собака]mail.ru
Спасибо.

а что именно не вышло? создать плагин? подключить плагин? создать сущность класса, описание которого хранится в плагине?

Создать сущность и как следствие создать плагин. До подключения дело вообще не дошло.