Russian Qt Forum

Программирование => Общий => Тема начата: inri13666 от Август 02, 2010, 11:53



Название: Слоты в динамической длл (Решено =) )
Отправлено: 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
то не работает говорит мол неправильно объявлен слот или сигнал. Я так понял что сигналы и слоты не могут быть виртуальными=((, но всё таки может кто сталкивался и как то решил эту проблему.

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

Заранее спасибо всем=)


Название: Re: Слоты в динамической длл
Отправлено: kuzulis от Август 02, 2010, 12:08
А чем Qt Plugin не устраивает?


Название: Re: Слоты в динамической длл
Отправлено: inri13666 от Август 03, 2010, 09:26
QT plugin не устраивает тем что плагины работают только с той версией библиотеки с которой были собраны, например SQLplugins собранные с версией 4.5.1 не будут работать с 4.5.2.

Вообще в идеале хочется сделать чтобы на форме создавался (динамически) допустим pushButton и на его сигнал Clicked() из DLL "подгружалась" функция слот, точнее из длл мы получаем объект класса и потом уже связываем сигнал и слот.


Название: Re: Слоты в динамической длл
Отправлено: inri13666 от Август 03, 2010, 10:40
Всё разобрался =))

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

Спасибо kuzulis за наводку на мысли о virtual slots =))