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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]  (Прочитано 5743 раз)
Crazy Sage
Гость
« : Май 28, 2014, 09:13 »

Добрый день. Пытаюсь создать плагин для Qt Designer'а со своими виджетами. Пока виджеты были независимы от других классов проекта всё было легко, понятно и делалось по прилагавшемуся к Qt примеру, но вот с появлением зависимостей (которые естественно тянут за собой другие зависимости) начались проблемы.
Сделал в каталоге с проектом .pri файл, в котором собрал файлы виджетов
Код:
INCLUDEPATH += $$PWD

HEADERS     += $$PWD/gui/degree-widget.h \
      $$PWD/gui/plotter-widget.h

SOURCES     += $$PWD/gui/degree-widget.cpp \
      $$PWD/gui/plotter-widget.cpp

FORMS += $$PWD/../ui/degree-widget.ui

Соответственно в проекте плагина подключил этот pri-файл

Код:
CONFIG      += designer plugin
TARGET      = m3widgetplugins
TEMPLATE    = lib

QTDIR_build:DESTDIR     = $$QT_BUILD_TREE/plugins/designer

include(../marshrut3/src/plugin.pri)

HEADERS += degree-widget-plugin.h \
plotter-widget-plugin.h \
m3-plugins.h
SOURCES += degree-widget-plugin.cpp \
plotter-widget-plugin.cpp \
m3-plugins.h

build_all:!build_pass {
    CONFIG -= build_all
    CONFIG += release
}

UI_DIR += ./.ui
MOC_DIR += ./.moc
OBJECTS_DIR += ./.obj

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

При попытке сборки получаю пачку ошибок с указанием на файл основного проекта, который, напрямую по крайней мере, к виджетам вообще не подключен. Ошибки вылезают на использование std::min и std::max и выглядят примерно следующим образом

error C2589: (: недопустимая лексема справа от '::'
error C2143: синтаксическая ошибка: отсутствие ")" перед "::"
error C2589: (: недопустимая лексема справа от '::'
error C2143: синтаксическая ошибка: отсутствие ";" перед "::"

В основном проекте никаких проблем эти строки не вызывают.
Что может быть недоконфигурировано в проекте плагина?
Компилятор MS Visual Studio 2008
Записан
Bepec
Гость
« Ответ #1 : Май 28, 2014, 11:13 »

Ну давайте приведём ваш вопрос в порядок для начала.

1) Вы хотите сделать плагин с зависимостью от внешних, не включенных в плагин cpp/h файлов?
2) Мб вы забыли заинклудить <algorithm>?
3) У вас ошибки плюются на код.  Потому привести код было бы желательно Улыбающийся
Записан
Crazy Sage
Гость
« Ответ #2 : Май 28, 2014, 12:11 »

1. Да, у меня в основном проекте есть виджеты, для которых я хочу сделать плагины QtDesigner'а, у этих виджетов есть зависимости внутри основного проекта, тащить их все в проект собирающий плагин значит перетащить туда почти весь основной проект, без этого хотелось бы обойтись. Мои виджеты содержатся в файлах degree-widget.h\cpp и plotter-widget.h\cpp
2. Ругается на код файла из основного проекта находящийся не в одном из этих файлов и не в файлах включенных непосредственно из них. (Впрочем если закомментарить этот код, то ругается на следующий файл, который уже включен напрямую из одного из плагинов, поэтому подозреваю, что проблема будет во всех файлах основного проекта, к которым так или иначе ведёт цепочка включений из виджетов). Файлы на которых возникает ошибка в полном порядке, в основном проекте они собираются безо всяких ошибок.
3. Код на который вылетает ошибка
Код:
struct Box2df32 {
  Box2df32(float32 ax0, float32 ay0, float32 ax1, float32 ay1) :
      x0(std::min(ax0, ax1)),
      y0(std::min(ay0, ay1)),
      x1(std::max(ax0, ax1)),
      y1(std::max(ay0, ay1)) {
  }
}

P.S. хотя кажется я неправильно понял раздел про .pri файл из статьи про плагины для дизайнера и надо как-то блокировать все эти зависимости при сборке для плагина.
Насколько плохой является идея поставить вокруг кода содержащего зависимости #ifdef'ы, которые будут его отключать при сборке для плагина засчет содержимого .pro-файла?  В paintEvent'е и функциях унаследованных от QWidget'а зависимостей нет.
« Последнее редактирование: Май 28, 2014, 12:21 от Crazy Sage » Записан
Bepec
Гость
« Ответ #3 : Май 28, 2014, 18:48 »

Нужно больше кода. А так бы я вообще посоветовал убрать нафиг зависимости Улыбающийся Если вы не хотите их тянуть в проект плагина, то не судьба их использовать.

PS Когда у меня была похожая задача, я рассматривал такой вариант, но в результате решил (обоснованно), что проще унифицировать интерфейс и перенести функционал в основной проект, оставив в плагинах только простые интерфейсы без зависимостей.
Записан
Crazy Sage
Гость
« Ответ #4 : Май 28, 2014, 20:39 »

А как разделение сделали?
Наследованием от базового интерфейса или в плагин инклуды-заглушки вставляли?
Записан
Bepec
Гость
« Ответ #5 : Май 28, 2014, 21:54 »

Разделение простое - как в стандартных виджетах.
Т.е. у виджеты в душе не чают о каких то зависимостях - их просто нет. А логика на стороне того, кто ими пользуется.

Пришлось конечно чуть переделать основную программу, но она от этого только выиграла по простоте кода и понятности. А "скользкие" моменты заткнул костылями. В результате получились красочные виджеты для применения в любых проектах без зависимостей и пара костылей. Вместо того, что пытаетесь сделать вы - плагин виджет с логикой и зависимостями. Тогда бы костылей и непонятных мест в основном проекте было бы в разы больше Веселый
« Последнее редактирование: Май 28, 2014, 21:58 от Bepec » Записан
Crazy Sage
Гость
« Ответ #6 : Май 29, 2014, 06:30 »

В целом-то понятно, что так как я сейчас делаю делать нехорошо, но один из виджетов портирую из старого проекта, ещё с Qt 3.3 и времени на то, чтобы его полностью переписать нету.
Со вторым всё из-за пары функций парсинга строки, которые нужны не только в графических частях проекта.
Записан
Bepec
Гость
« Ответ #7 : Май 29, 2014, 06:52 »

Можно сразу разрубить этот узел - и переписать через силу. А можно тянуть дальше.

У меня выбор проще был - я писал программу с нуля Улыбающийся

PS а вот с парсингом не понял. Если там простая ф-ция аля получить значения, то почему бы её не вынести в отдельный файл?
Записан
Crazy Sage
Гость
« Ответ #8 : Май 29, 2014, 07:35 »

Да там тоже ряд паразитарных зависимостей из-за того, что в классе несколько функций, в общем-то это уже разбираемо вполне.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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