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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к основному окну из плагина  (Прочитано 6266 раз)
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
Записан
Rcus
Гость
« Ответ #1 : Июнь 30, 2009, 13:25 »

/* Размышляет о работае компоновщика(линкера) и понимает как это неблагодарный труд... работаешь работаешь а о тебе никто не знает */
Прочитайте контракт с другой стороны: ваше приложение знает о плагинах, а как плагины узнают о приложении?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Июнь 30, 2009, 13:29 »

плагин использует определение класса MainWindow, но не линкуется с его реализацией. По умолчанию многие линкеры позволяют оставлять undefined символы в библиотеке. Вставь

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

в plugin.pro, и плагин перестанет компилироваться с такой же ошибкой. Нужно общий код, используемый программой и плагином (в данном случае класс MainWindow) выделить в одну библиотеку типа libMyProgramCommon, и линковать с ней и программу и плагин.
Записан
BRE
Гость
« Ответ #3 : Июнь 30, 2009, 13:34 »

Добавь в файл проекта самой программы:
QMAKE_LFLAGS += -Wl,-export-dynamic
Записан
SABROG
Гость
« Ответ #4 : Июнь 30, 2009, 14:26 »

Раз пошла такая пьянка по форумам отвечать 2 раза, то и я свои 5 копеек внесу Улыбающийся

Код
C++ (Qt)
virtual QLineEdit* getEditor();
 
Записан
ExMagistr
Гость
« Ответ #5 : Июнь 30, 2009, 14:28 »

Спасибо за быстрый ответ Улыбающийся
В свое оправдание хочу сказать, что имею лишь интуитивное понимание работы компоновщика\линкера и вообще всяких внутренних процессов и поэтому доля безграмотности проникла в мой вопрос Грустный -
я наивно надеялся, что раз передаю указатель на участок памяти, значит получаю к нему полный доступ....
Добавь в файл проекта самой программы:
QMAKE_LFLAGS += -Wl,-export-dynamic
Спасибо, для тестового примера помогло Улыбающийся теперь, если что, понятно, в какую сторону смотреть
Записан
SABROG
Гость
« Ответ #6 : Июнь 30, 2009, 14:29 »

Может тогда кто-нибудь выложит ключики и для MSVC?
Записан
ExMagistr
Гость
« Ответ #7 : Июнь 30, 2009, 14:35 »

Раз пошла такая пьянка по форумам отвечать 2 раза, то и я свои 5 копеек внесу Улыбающийся

Код
C++ (Qt)
virtual QLineEdit* getEditor();
 
Ну я просто, чтоб наверняка, в двух форумах тему завел Улыбающийся
Теперь целых два рабочих варианта Улыбающийся ну уж если теперь кто-нибудь не сочтет за труд подвести теоретическое обоснование корректности каждого из них Улыбающийся ну да же если и нет, теперь знаю про что теорию копать Улыбающийся
Записан
SABROG
Гость
« Ответ #8 : Июнь 30, 2009, 14:39 »

Да это популярная тема на самом деле.
« Последнее редактирование: Июнь 30, 2009, 14:42 от SABROG » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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