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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Слоты в динамической длл (Решено =) )  (Прочитано 3066 раз)
inri13666
Гость
« : Август 02, 2010, 11:53 »

Доброго времени суток всем=)

Не подскажет ли кто можно ли в динамической библиотеке в классе объявлять Слоты. Библиотека подключается по механизму позднего связывания. Методы класса виртуальные и не экспортируются из длл, вообще из длл экспортируется только одна функция которая возвращает объект класса.

вот исходники длл

"Dllclass.h"
Код:
#ifndef DLLCLASS_H
#define DLLCLASS_H

class Dllclass {
public:
    Dllclass();
public:
    void virtual temp();

};

#endif // DLLCLASS_H

"Dllclass.cpp"
Код:
#include "dllclass.h"
#include <iostream>
#include "stdio.h"
#include "conio.h"
#include "dllclass_global.h"

Dllclass::Dllclass()
{
}
void Dllclass::temp()
{
    std::cout << "Load OK Hello From DLL" << std::endl;
}
FUNC_EXPORT Dllclass* test()
{
    return new Dllclass();
}

"dllclass_global.h"
Код:
#ifndef DLLCLASS_GLOBAL_H
#define DLLCLASS_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(DLLCLASS_LIBRARY)
#  define FUNC_EXPORT extern "C" Q_DECL_EXPORT __declspec(dllexport)
#else
#  define FUNC_EXPORT extern "C" Q_DECL_IMPORT __declspec(dllexport)
#endif

#endif // DLLCLASS_GLOBAL_H

Клиент класса
Код:
#include <QtCore/QCoreApplication>
#include <QLibrary>
#include "../dllclass/dllclass.h"
#include <iostream>
#include "stdio.h"
#include "conio.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QLibrary mylib("dllclass");

    if(mylib.load())
    {

        typedef Dllclass* (*MYFUNCTION)();
        MYFUNCTION test = (MYFUNCTION) (mylib.resolve("test"));
        if(test)
        {
            std::cout << "Function Loaded OK" << std::endl;
            Dllclass *v = test();
            v->temp();
        }
        else
        {
            std::cout << "Function Not Loaded" << std::endl;
        }
        //===================================================
        mylib.unload();
        getch();
        return 0;
    }
    else
    {
        std::cout << "Load failed!!!" << std::endl;
        return -1;
    }
    return a.exec();
}

Так всё работает, но возникла необходимость использовать механизм Сигналов-Слотов и интересует возможно ли вообще при таком позднем связывании использовать его. Вопрос может и не возник бы но если написать вот так
Код:
#ifndef DLLCLASS_H
#define DLLCLASS_H
#include <QObject> //<----

class Dllclass {

Q_OBJECT //<----

public:
    Dllclass();
public slots:
    void virtual temp(); //<----

};

#endif // DLLCLASS_H
то не работает говорит мол неправильно объявлен слот или сигнал. Я так понял что сигналы и слоты не могут быть виртуальными=((, но всё таки может кто сталкивался и как то решил эту проблему.

З.Ы. Вариант с промежуточным классом лоадером тоже неплохо но если в классе добавиться еще слоты или сигналы то нужно и в лоадере их тоже описывать.

Заранее спасибо всем=)
« Последнее редактирование: Август 03, 2010, 16:13 от inri13666 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Август 02, 2010, 12:08 »

А чем Qt Plugin не устраивает?
Записан

ArchLinux x86_64 / Win10 64 bit
inri13666
Гость
« Ответ #2 : Август 03, 2010, 09:26 »

QT plugin не устраивает тем что плагины работают только с той версией библиотеки с которой были собраны, например SQLplugins собранные с версией 4.5.1 не будут работать с 4.5.2.

Вообще в идеале хочется сделать чтобы на форме создавался (динамически) допустим pushButton и на его сигнал Clicked() из DLL "подгружалась" функция слот, точнее из длл мы получаем объект класса и потом уже связываем сигнал и слот.
Записан
inri13666
Гость
« Ответ #3 : Август 03, 2010, 10:40 »

Всё разобрался =))

В аттаче пример

Спасибо kuzulis за наводку на мысли о virtual slots =))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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