Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: Crazy Sage от Май 28, 2014, 09:13



Название: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: 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


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Bepec от Май 28, 2014, 11:13
Ну давайте приведём ваш вопрос в порядок для начала.

1) Вы хотите сделать плагин с зависимостью от внешних, не включенных в плагин cpp/h файлов?
2) Мб вы забыли заинклудить <algorithm>?
3) У вас ошибки плюются на код.  Потому привести код было бы желательно :)


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Crazy Sage от Май 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'а зависимостей нет.


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Bepec от Май 28, 2014, 18:48
Нужно больше кода. А так бы я вообще посоветовал убрать нафиг зависимости :) Если вы не хотите их тянуть в проект плагина, то не судьба их использовать.

PS Когда у меня была похожая задача, я рассматривал такой вариант, но в результате решил (обоснованно), что проще унифицировать интерфейс и перенести функционал в основной проект, оставив в плагинах только простые интерфейсы без зависимостей.


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Crazy Sage от Май 28, 2014, 20:39
А как разделение сделали?
Наследованием от базового интерфейса или в плагин инклуды-заглушки вставляли?


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Bepec от Май 28, 2014, 21:54
Разделение простое - как в стандартных виджетах.
Т.е. у виджеты в душе не чают о каких то зависимостях - их просто нет. А логика на стороне того, кто ими пользуется.

Пришлось конечно чуть переделать основную программу, но она от этого только выиграла по простоте кода и понятности. А "скользкие" моменты заткнул костылями. В результате получились красочные виджеты для применения в любых проектах без зависимостей и пара костылей. Вместо того, что пытаетесь сделать вы - плагин виджет с логикой и зависимостями. Тогда бы костылей и непонятных мест в основном проекте было бы в разы больше :D


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Crazy Sage от Май 29, 2014, 06:30
В целом-то понятно, что так как я сейчас делаю делать нехорошо, но один из виджетов портирую из старого проекта, ещё с Qt 3.3 и времени на то, чтобы его полностью переписать нету.
Со вторым всё из-за пары функций парсинга строки, которые нужны не только в графических частях проекта.


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Bepec от Май 29, 2014, 06:52
Можно сразу разрубить этот узел - и переписать через силу. А можно тянуть дальше.

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

PS а вот с парсингом не понял. Если там простая ф-ция аля получить значения, то почему бы её не вынести в отдельный файл?


Название: Re: Создание плагина для Qt Designer с подключением внешнего кода [Qt 4.8]
Отправлено: Crazy Sage от Май 29, 2014, 07:35
Да там тоже ряд паразитарных зависимостей из-за того, что в классе несколько функций, в общем-то это уже разбираемо вполне.