Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: SpiritFire от Октябрь 20, 2009, 17:50



Название: Добавление CustomWidget, линковка
Отправлено: SpiritFire от Октябрь 20, 2009, 17:50
Прошу прощения за глупый вопрос, долго ковырялся с примером, создал свой виджет и бодавил его в Designer. Вроде все хорошо, но при добавлении его на пустую форму и сборке вылазят ошибки вида:

Код:
debug/mainwindow.o: In function `ZN10MainWindowD0Ev':
D:/Qt_projects/GraphTest/mainwindow.cpp:13: undefined reference to `GraphWidget::GraphWidget(QWidget*)'

Вот проектный файл плагина, все указал.
Код:
QT += opengl
CONFIG += designer \
    plugin
TARGET = $$qtLibraryTarget($$TARGET)
TEMPLATE = lib
QTDIR_build:DESTDIR = $$QT_BUILD_TREE/plugins/designer
HEADERS += ../ui_graphwidget.h \
    ../SinFunctor.h \
    ../HorizontalLineBar.h \
    ../graphwidget.h \
    ../GraphView.h \
    ../GraphItem.h \
    ../VerticalLineBar.h \
    GraphWidgetInterface.h
SOURCES += ../VerticalLineBar.cpp \
    ../HorizontalLineBar.cpp \
    ../graphwidget.cpp \
    ../GraphView.cpp \
    ../GraphItem.cpp \
    GraphWidgetInterface.cpp

# install
target.path = $$[QT_INSTALL_PLUGINS]/designer
sources.files = $$SOURCES \
    $$HEADERS \
    *.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/designer/customwidgetplugin
INSTALLS += target \
    sources

Помогите, пожалуйста, в чем проблема?
Указанный конструктор находится в файле "../graphwidget.cpp", который в проект виджета включен, объектный файл плагина (.а) лежит в /plugins/designer... В чем-то туплю, а вот в чем понять не могу


Название: Re: Добавление CustomWidget, линковка
Отправлено: Rcus от Октябрь 20, 2009, 18:21
/* Выжимка из потока негодования по поводу непонимания устройства toolchain */
Посмотрите на список библиотек подключенных в проект, если среди них есть экспортирующая ваш класс то посмотрите какие символы она экспортирует (objdump/depwalker), если найдется нужный то это интересно, иначе g Q_DECL_EXPORT/LIBS+=


Название: Re: Добавление CustomWidget, линковка
Отправлено: SpiritFire от Октябрь 20, 2009, 19:14
/* Выжимка из потока негодования по поводу непонимания устройства toolchain */
Посмотрите на список библиотек подключенных в проект, если среди них есть экспортирующая ваш класс то посмотрите какие символы она экспортирует (objdump/depwalker), если найдется нужный то это интересно, иначе g Q_DECL_EXPORT/LIBS+=

Извините, но можно подробнее, или ссылку что почитать? Я с Qt знаком ровно две недели, g++ юзал дольше, под линухом, но что генерируется Qt-ями я без понятия.

Ну, с ".о" - это понятно, объектники. а что такое ".а"-файл? Я так понимаю, сама библиотека? При ее добавлении то же самое.


Название: Re: Добавление CustomWidget, линковка
Отправлено: break от Октябрь 20, 2009, 22:11
Программа не линкуется с виджетом!

Проект программы на форме которой лежит ваш катомный виджет должен линковаться с ним

в про файле что-то типа


INCLUDEPATH += /CUSTOM_WIDGET_INCLUDE_DIR

LIBS += -LCUSTOM_WIDGET_LIB_DIR
  -lCUSTOM_WIDGET_LIBRARY_NAME


Название: Re: Добавление CustomWidget, линковка
Отправлено: zamnach от Октябрь 21, 2009, 14:56
попробуйте удалить из секций HEADER и SOURCE pro-файла упоминания файлов плагина.


Название: Re: Добавление CustomWidget, линковка
Отправлено: SpiritFire от Октябрь 23, 2009, 15:40
попробуйте удалить из секций HEADER и SOURCE pro-файла упоминания файлов плагина.
Их там нет.

Программа не линкуется с виджетом!

Проект программы на форме которой лежит ваш катомный виджет должен линковаться с ним

в про файле что-то типа


INCLUDEPATH += /CUSTOM_WIDGET_INCLUDE_DIR

LIBS += -LCUSTOM_WIDGET_LIB_DIR
  -lCUSTOM_WIDGET_LIBRARY_NAME

Либа - это файл с расширением ".а" - я правильно понял? Тогда вероятно, что в нем не описываются нужные мне экспорты, потому что в проекте прилинковал. В проекта или исходниках плагина нужно как-то упоминать, что определенная функция должна экспортироваться? Если да, то как?


Название: Re: Добавление CustomWidget, линковка
Отправлено: break от Октябрь 24, 2009, 01:20
.a в случае статической линковки, в случае динамической .so в Linux или .dll в Windows но в файлах проекта они указываются без расширений - только имена

Для корректного экспорта вашего виджета - нужно использовать директиву Q_DECL_EXPORT для всех классов в библиотеке а для самого класса кастомного виджета директиву QDESIGNER_WIDGET_EXPORT - вместо нее. Во вложении шлю вам пример одного компонента - светодиодик кот. горит или не горит - код тривиален подсмотрите все что вам нужно и сделайте аналогично. Для использования такого виджета в проекте программы надо добавить


INCLUDEPATH += ../CustomWidgets/QLED

LIBS += -L../lib \
-lQLED


Но вам надо разобраться с относительными путями в проекте - у меня так и программа и виджет в одном родительском проекте subdirs

ПРОГРАММА
ВИДЖЕТЫ
------КАCТОМНЫЙ ВИДЖЕТ

а все динамически библиотеки в том числе и кастомные виджеты компилируются и кладутся в общую папку lib внутри главного каталога проекта

LIB
ПРОГРАММА
ВИДЖЕТЫ
------КАСТОМНЫЙ ВИДЖЕТ

поэтому в прошнике моей программы строка "-L../lib" указывает где лежат Библиотеки, а "-lQLED" указывает какую из них слинковать с программой.

В виджете стоит DESTDIR = ../../lib чтобы его библиотека попала в ту самою папку lib

Я не являюсь автором данного компонента - а только использую его - все указания на автора сохранены!