Russian Qt Forum
Июля 01, 2025, 16:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Плагин из приложения.  (Прочитано 6974 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Июня 02, 2011, 20:12 »

Есть некое приложение, нельзя сказать чтобы совсем маленькое, тысяч 30 строк. У него есть свое MainWindow:QMainWindow, в котором есть кучка "подокон", меню, тулбар и т.д. Теперь надо из этого приложения сделать плагин, чтобы его можно было подключать к другому приложению. Вот пока в раздумьях, как это лучше всего реализовать... Переписывать приложение, отказываться от MainWindow не с руки, это самый долгий путь, а время дорого. Поэтому вопрос - как поддержка плагинов в Qt 4.7 относится к тому, что в плагине может быть свое MainWindow? Допустимо ли это? Окно плагина обязательно должно присутствовать на экране одновременно с окном основного приложения (в частности, чтобы их можно было легко разнести на 2 монитора). Поэтому нельзя использовать окно основного приложения для размещения подокон плагина, да и технически это выглядело бы очень непросто.

Есть, конечно, вариант сделать общение между приложениями через IP, у такого варианта есть свои преимущества. Но есть и недостатки, причем более низкая скорость - самый существенный.

Кто какие идеи может подать? Принимаются к обсуждению любые варианты.
Записан

2^7-1 == 127, задумайтесь...
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июня 02, 2011, 21:26 »

При желании QMainWindow (и его наследников) можно использовать как обычные виджеты. Можно его вообще встроить в новое главное окно, как обычный виджет. Ну и как обычное окно тоже можно.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Июня 02, 2011, 21:49 »

a-ha... тогда должно все просто сразу заработать...
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Июня 03, 2011, 13:25 »

BTW, начал проектировать, и вспомнилось - эх, а как хорошо было придумано в ОС BeOS... там приложение целиком можно было встраивать в другое приложение, и имелся механизм общения между приложениями, или внутри приложений, очень похожий на сигнал-слоты Qt, причем легко автоматизировалось встраивание и соединение приложений

то есть, например, делаешь Часы - они сами по себе работают на десктопе, но их можно перетащить (или скопировать) в окно, например редактора текстов - они становятся встроенными в редактор, и при клике на часы, например, передают текущее время в текст
Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Июня 06, 2011, 19:51 »

up

не выходит каменный цветок...

описан класс интерфейса:

Код:
class QApplication;

class _interface
{
public:
    virtual ~_interface();
    virtual void start_plugin( QApplication* );
};

Q_DECLARE_INTERFACE( _interface, "ru.home.plugin._interface/1.5")

объевлен такой класс:

Код:
#include <QObject>
#include "_interface.h"

class QApplication;

class main_plugin : public QObject, public _interface {
    Q_OBJECT
    Q_INTERFACES( _interface )

public:
    virtual ~main_plugin(){}
    virtual void start_plugin( QApplication * );
};

далее в коде реализации класса следующее (необходимые инклюды все на месте):

Код:
MainWindow *glpMainWindow;
void main_plugin::start_plugin( QApplication* a )
{
    glpMainWindow = new MainWindow( a );
    glpMainWindow->show();
    return;
}

Q_EXPORT_PLUGIN2( _interface, main_plugin )

начало .pro

Код:
TARGET = CI_FED15
TEMPLATE = lib
CONFIG += plugin dll

дальше в .pro все тоже самое, что было для самостоятельного бинариника

в результате получаю при сборке кучу ошибок типа vtable not found...

надо заметить, что пытаюсь собрать со статической версией Qt, в надежде, что в плагин будут включены нужные функции из QtGui и QtCore (больше ничего в нем не испольузется) - ну и потому, что статический Qt сейчас настроен и используется, приложение собиралось статически и все работало

может я перемудрил, и плагины в принципе работают только в варианте динамической сборки? кто-нибудь что-то подобное делал?


« Последнее редактирование: Июня 07, 2011, 17:28 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #5 : Июня 07, 2011, 07:24 »

Есть такое понятие как статические плагины.
И нормально работают.
Их надо откомпилировать статически, подключить в проектном файле, а затем например в main.cpp
импортировать.
Например так:

#ifdef STATICPLUGIN
#include <QtPlugin>
Q_IMPORT_PLUGIN(qPFilesBD)
Q_IMPORT_PLUGIN(qPCommunicationsPlugin)
Q_IMPORT_PLUGIN(qPTimersPlugin)
#endif
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Июня 07, 2011, 12:42 »

может стоит и статическим этот плагин сделать, однако пока не понятно, в чем проблема при его сборке

и что-то я недопонял, что такое "статический плагин" - это плагин, который всегда должен быть, без него приложение не загрузится для выполнения? или как это?

у меня плагин делается из приложения, причем может быть его 2 варианта - инженерный, используется заказчиком, включает всякие средства, нужные для разработки, или поставочный, его заказчик будет поставлять своим клиентам, там эти средства будут отсутствовать, то есть, в инженерной версии должна быть одна dll, а в поставочной одноименная, с такими же интерфейсами, но внутри другая - такой плагин может быть статическим?

и еще при этом надо иметь возможность собирать по-старому самостоятельное приложение, причем статической сборкой с Qt... такой вот пирожок

ЗЫ: с динамическими библиотеками Qt получилось собрать .dll плагина, теперь надо посмотреть, как он будет вызываться...
« Последнее редактирование: Июня 07, 2011, 14:10 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #7 : Июня 07, 2011, 15:53 »

не работает... все собирается, плагин ложится куда надо, приложение собирается, сделал в нем загрузку плагина по Шлее,

Код:
    QDir dir( QApplication::applicationDirPath() );
    QPluginLoader PluginLoader( dir.absoluteFilePath("pluginapp.dll") );
    QObject* pluginapp = qobject_cast<QObject*>( PluginLoader.instance() );

pluginapp == NULL...  Грустный

куда копать, не понятно...

Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #8 : Июня 07, 2011, 15:59 »

куда копать, не понятно...
Что вернет этот метод?
QString QPluginLoader::errorString () const
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Июня 07, 2011, 16:03 »

возвращает "Unknown error"  Непонимающий

поле PluginLoader->did_load == false, все остальные поля == NULL
Записан

2^7-1 == 127, задумайтесь...
BRE
Гость
« Ответ #10 : Июня 07, 2011, 16:11 »

возвращает "Unknown error"  Непонимающий
В каком месте ты вызываешь этот метод?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #11 : Июня 07, 2011, 16:16 »

Код:
    QDir dir( QApplication::applicationDirPath() );
    QPluginLoader PluginLoader( dir.absoluteFilePath("CI_FED15.dll") );
    QString errstr = PluginLoader.errorString();
    QObject* CI_FED = qobject_cast<QObject*>( PluginLoader.instance() );

если так

Код:
    QDir dir( QApplication::applicationDirPath() );
    QPluginLoader PluginLoader( dir.absoluteFilePath("CI_FED15.dll") );
    QObject* CI_FED = qobject_cast<QObject*>( PluginLoader.instance() );
    QString errstr = PluginLoader.errorString();

тоже самое

проверил, файл плагина доступен по маршруту, все нормально, но плагин почему-то не грузится
« Последнее редактирование: Июня 07, 2011, 16:34 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Июня 07, 2011, 20:50 »

cделал еще один плагин, пустышку, точно по Шлее - не работает, та же беда, не грузится, ошибка неизвестна...  Грустный

попытался так:

Код:
    a->addLibraryPath( a->applicationDirPath() );
    QPluginLoader PluginLoader( "EmptyPlugin.dll" /*abspath*/ );
    QObject* CI_FED = qobject_cast<QObject*>( PluginLoader.instance() );

эффект тот же

тупик...
« Последнее редактирование: Июня 07, 2011, 21:04 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #13 : Июня 07, 2011, 22:45 »

выяснил, что не устанавливается имя плагина

Код:
    QPluginLoader PluginLoader( "EmptyPlugin.dll" );
    // или
    QPluginLoader PluginLoader();
    PluginLoader.setFileName( "EmptyPlugin.dll" );
    QString plugname = PluginLoader.fileName();

plugname == NULL, бред какой-то...  Непонимающий
« Последнее редактирование: Июня 07, 2011, 22:49 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Июня 08, 2011, 16:30 »

перепробовал разные способы задать PluginLoader имя файла плагина - и с полным маршрутом напрямую, и с разными наклонами слэша и всяко разно - не берет имя ни в какую

буду писать багрепорт, но хорошо бы, чтобы кто-нибудь тоже проверил
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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