Russian Qt Forum

Qt => Общие вопросы => Тема начата: ExMagistr от Июнь 30, 2009, 12:59



Название: Доступ к основному окну из плагина
Отправлено: ExMagistr от Июнь 30, 2009, 12:59
Всем доброго времени суток!
Хочу написать приложение, расширяемое плагинами, в том числе дать доступ плагинам к элементам интерфейса основного окна, например к элементам ввода, меню и т.п. Во время выполнения, в момент вызова метода плагина, программа валится с ошибкой.
Для тестового примера:
Метод плагина:
Код:
void Plugin::writeString(MainWindow* win)
{
win->getEditor()->setText("Hello!");
}
где win->getEditor() возвращает указатель на элемент QLineEdit основного окна MainWindow. Текст ошибки:

Код:
symbol lookup error: /home/proffa/qt/testplugin/bin/plugin/libplugin.so: undefined symbol: _ZN10MainWindow9getEditorEv

Кто нибудь может подсказать, что не так сделано, и возможно ли вообще реализовать подобную идею? Может как-нидь по другому, не через плагины? Заранее спасибо.
P.S.: работаю под Ubuntu 9.04, Qt 4.5.1, исходники тестового пример: http://narod.ru/disk/10435014000/testplugin.zip.html


Название: Re: Доступ к основному окну из плагина
Отправлено: Rcus от Июнь 30, 2009, 13:25
/* Размышляет о работае компоновщика(линкера) и понимает как это неблагодарный труд... работаешь работаешь а о тебе никто не знает */
Прочитайте контракт с другой стороны: ваше приложение знает о плагинах, а как плагины узнают о приложении?


Название: Re: Доступ к основному окну из плагина
Отправлено: Alex Custov от Июнь 30, 2009, 13:29
плагин использует определение класса MainWindow, но не линкуется с его реализацией. По умолчанию многие линкеры позволяют оставлять undefined символы в библиотеке. Вставь

Цитировать
QMAKE_LFLAGS += -Wl,--no-undefined

в plugin.pro, и плагин перестанет компилироваться с такой же ошибкой. Нужно общий код, используемый программой и плагином (в данном случае класс MainWindow) выделить в одну библиотеку типа libMyProgramCommon, и линковать с ней и программу и плагин.


Название: Re: Доступ к основному окну из плагина
Отправлено: BRE от Июнь 30, 2009, 13:34
Добавь в файл проекта самой программы:
QMAKE_LFLAGS += -Wl,-export-dynamic


Название: Re: Доступ к основному окну из плагина
Отправлено: SABROG от Июнь 30, 2009, 14:26
Раз пошла такая пьянка по форумам отвечать 2 раза, то и я свои 5 копеек внесу :)

Код
C++ (Qt)
virtual QLineEdit* getEditor();
 


Название: Re: Доступ к основному окну из плагина
Отправлено: ExMagistr от Июнь 30, 2009, 14:28
Спасибо за быстрый ответ :)
В свое оправдание хочу сказать, что имею лишь интуитивное понимание работы компоновщика\линкера и вообще всяких внутренних процессов и поэтому доля безграмотности проникла в мой вопрос :( -
я наивно надеялся, что раз передаю указатель на участок памяти, значит получаю к нему полный доступ....
Добавь в файл проекта самой программы:
QMAKE_LFLAGS += -Wl,-export-dynamic
Спасибо, для тестового примера помогло :) теперь, если что, понятно, в какую сторону смотреть


Название: Re: Доступ к основному окну из плагина
Отправлено: SABROG от Июнь 30, 2009, 14:29
Может тогда кто-нибудь выложит ключики и для MSVC?


Название: Re: Доступ к основному окну из плагина
Отправлено: ExMagistr от Июнь 30, 2009, 14:35
Раз пошла такая пьянка по форумам отвечать 2 раза, то и я свои 5 копеек внесу :)

Код
C++ (Qt)
virtual QLineEdit* getEditor();
 
Ну я просто, чтоб наверняка, в двух форумах тему завел :)
Теперь целых два рабочих варианта :) ну уж если теперь кто-нибудь не сочтет за труд подвести теоретическое обоснование корректности каждого из них :) ну да же если и нет, теперь знаю про что теорию копать :)


Название: Re: Доступ к основному окну из плагина
Отправлено: SABROG от Июнь 30, 2009, 14:39
Да это популярная тема (http://www.google.ru/search?hl=ru&newwindow=1&q=dll+%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B+%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2+%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0+virtual&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=) на самом деле.