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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Plugin в Qt  (Прочитано 10664 раз)
Rainbow
Гость
« : Декабрь 16, 2004, 23:34 »

Проблема в следующем: надо засунуть форму в библиотеку(.dll, .so). Когда приложение запускается, просматривате эти библотеки и загружает все доступны формы ч-з определенную ф-ю. Проблема вся в том что без QApplication это дело работать не будеть.

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

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

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

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Декабрь 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;
}
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #2 : Декабрь 17, 2004, 08:51 »

да и еще

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

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

так что в dll может быть все
Записан
Rainbow
Гость
« Ответ #3 : Декабрь 17, 2004, 17:03 »

Оказывается проблема в загрузке класса была. Правильно должно быть:
Код:

  QWidget *xxx= factory.createWidget( "QAiredaleForm", this, "AiredaleForm");
Записан
Rainbow
Гость
« Ответ #4 : Март 11, 2005, 21:39 »

A вот в Линуксе оказалось что скопировать соотвествующую директориюю недостаточно. Всеровно не видит. Дизайнер в том числе.
Записан
joktar
Гость
« Ответ #5 : Март 13, 2005, 14:50 »

ldconfig не пробовал запускать?
Записан
Rainbow
Гость
« Ответ #6 : Март 14, 2005, 12:37 »

Пробывал естествено. Самое интресно что вдома работает на на роботе фиг вам.
Записан
Sergeich
Гость
« Ответ #7 : Март 17, 2005, 15:42 »

Создай каталог designer в каталоге из которого запускается твое приложение и помести в него свою dll-ку. Потом добавь в код qApp->addLibraryPath( qApp->applicationDirPath () );
Записан
Rainbow
Гость
« Ответ #8 : Март 22, 2005, 13:55 »

Это я уже давно прописал.
Дело в том что если дизайнеру скопировать в соотвествующюю директорию, то он всеровно не видит.
Записан
Keiko
Гость
« Ответ #9 : Март 22, 2005, 21:02 »

а если банально в /usr/lib ?
Записан
Rainbow
Гость
« Ответ #10 : Март 23, 2005, 14:15 »

Прикалуешся? Если на то пошло то в до четко написано где должны легать плуги.
Записан
Keiko
Гость
« Ответ #11 : Март 25, 2005, 01:31 »

Стоп. Ещё раз - где лежат плагины для дизайнера и библиотеки с ваджетами ?
Записан
Rainbow
Гость
« Ответ #12 : Март 28, 2005, 19:03 »

Вариант один:
/usr/lib/qt3/plugins/designer
Вариант два (для чего собствено создаются)
/usr/local/$(MY_PROJECT)/plugins/designer
Путь /usr/local/$(MY_PROJECT)/plugins в списке библотек есть.
Ни в одном ни в другом случае не работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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