Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Rainbow от Декабрь 16, 2004, 23:34



Название: Plugin в Qt
Отправлено: Rainbow от Декабрь 16, 2004, 23:34
Проблема в следующем: надо засунуть форму в библиотеку(.dll, .so). Когда приложение запускается, просматривате эти библотеки и загружает все доступны формы ч-з определенную ф-ю. Проблема вся в том что без QApplication это дело работать не будеть.

Можно оформить как QWidgetPlugin. Пробую.
Дизайнер схватил сразу.
Теперь вопрос: а как мне можно подключить его в своем приложении? Если дизайнеру достатно DLL, тогда получатеся что для моего приложения тоже достаточно DLL. Но не тут то было.
Код:

QWidget *xxx= QWidgetFactory::create("QAiredaleForm", 0, 0);

Чему равно ххх? Правильно! Нулю.
Отсюда можно сделать вывод: приложение ее просто не видит. Где она должна находится?
Смотрим в Assistan. Написано: QApplication::addLibraryPath(). Добаляем "./" , содаем designer,помещаем туда dll-ку а толку ноль.
Вопрос тогда где же она должна быть?


Название: Plugin в Qt
Отправлено: Admin от Декабрь 17, 2004, 08:49
посмотри я когда то делал для программы загрузку всех плагинов из папки и ролучение их интерфейса

Код:
#include "pluginmanager.h"
#include <qdir.h>
#include <qlibrary.h>
#include <qstringlist.h>


CPluginManager::CPluginManager(QString dirPath,QWidget* pWnd)
{
    m_dirPath=dirPath;
    m_pparentWindow=pWnd;
}

bool CPluginManager::load()
{
    QDir dir(m_dirPath);

    if(!dir.exists()) return false;

    const QFileInfoList* files = dir.entryInfoList("*.so *.dll",QDir::Files);

    if(!files) return false;

    QFileInfoListIterator it( *files );
    QFileInfo * fi;

    while((fi=it.current())!=0)
    {
++it;

QString file = fi->fileName();

//remove lib prefix
if(file.left(3) == "lib") file.remove(0,3);

if(file.left(2)!="ie" ) continue;

file=fi->baseName();

//remove lib prefix
#ifndef Q_WS_WIN
file.remove(0,3);
#endif

file=m_dirPath+"/"+file;

        QLibrary lib(file);

        if(!lib.load()) continue;

typedef CIEBasePlugin* (*pf)();
pf plugin = (pf)lib.resolve("getPlugin");

if( plugin==NULL ) continue;

funInfo fInfo;

fInfo.pFun = plugin();
fInfo.pFun->getFunctionName(fInfo.funName);
fInfo.pFun->getFunctionNameMenu(fInfo.menuName);
fInfo.pFun->getFunctionPriority(fInfo.priority);
fInfo.pFun->getFunctionMenuSub(fInfo.menuSub);

m_funInfo.append(fInfo);

qDebug("Load plugins: %s, function: %s,menu sub: %s, menu name: %s, priority: %d",file.latin1(),fInfo.funName.latin1(),fInfo.menuSub.latin1(),fInfo.menuName.latin1(),fInfo.priority);
    }

    return true;
}

bool CPluginManager::unload()
{
    return true;
}


Название: Plugin в Qt
Отправлено: Admin от Декабрь 17, 2004, 08:51
да и еще

делал тут эксперимент
если QT приложение загружает DLL, то оказывается что в DLL становится доступным обьект qApp

как они это сделали я не понял, но это работает

так что в dll может быть все


Название: Plugin в Qt
Отправлено: Rainbow от Декабрь 17, 2004, 17:03
Оказывается проблема в загрузке класса была. Правильно должно быть:
Код:

  QWidget *xxx= factory.createWidget( "QAiredaleForm", this, "AiredaleForm");


Название: Plugin в Qt
Отправлено: Rainbow от Март 11, 2005, 21:39
A вот в Линуксе оказалось что скопировать соотвествующую директориюю недостаточно. Всеровно не видит. Дизайнер в том числе.


Название: Plugin в Qt
Отправлено: joktar от Март 13, 2005, 14:50
ldconfig не пробовал запускать?


Название: Plugin в Qt
Отправлено: Rainbow от Март 14, 2005, 12:37
Пробывал естествено. Самое интресно что вдома работает на на роботе фиг вам.


Название: Plugin в Qt
Отправлено: Sergeich от Март 17, 2005, 15:42
Создай каталог designer в каталоге из которого запускается твое приложение и помести в него свою dll-ку. Потом добавь в код qApp->addLibraryPath( qApp->applicationDirPath () );


Название: Plugin в Qt
Отправлено: Rainbow от Март 22, 2005, 13:55
Это я уже давно прописал.
Дело в том что если дизайнеру скопировать в соотвествующюю директорию, то он всеровно не видит.


Название: Plugin в Qt
Отправлено: Keiko от Март 22, 2005, 21:02
а если банально в /usr/lib ?


Название: Plugin в Qt
Отправлено: Rainbow от Март 23, 2005, 14:15
Прикалуешся? Если на то пошло то в до четко написано где должны легать плуги.


Название: Plugin в Qt
Отправлено: Keiko от Март 25, 2005, 01:31
Стоп. Ещё раз - где лежат плагины для дизайнера и библиотеки с ваджетами ?


Название: Plugin в Qt
Отправлено: Rainbow от Март 28, 2005, 19:03
Вариант один:
/usr/lib/qt3/plugins/designer
Вариант два (для чего собствено создаются)
/usr/local/$(MY_PROJECT)/plugins/designer
Путь /usr/local/$(MY_PROJECT)/plugins в списке библотек есть.
Ни в одном ни в другом случае не работает.