Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: dr_Begemot от Апрель 24, 2009, 12:42



Название: добавление в Designers собственных виджетов
Отправлено: dr_Begemot от Апрель 24, 2009, 12:42
Вопрос такой, как добавить собственный виджет к designers?

Сделал так:
в pro-файле написал:
Код:
TEMPLATE      = lib
CONFIG       += designer plugin release
HEADERS       = ../ColorButton/ColorButton.h \
                ColorButtonPlugin.h
SOURCES       = ../ColorButton/ColorButton.cpp \
                ColorButtonPlugin.cpp
RESOURCES     = ColorButtonPlugin.qrc
DESTDIR       = $$[QT_INSTALL_PLUGINS]/designer

В файле ColorButtonPlugin.h
Код:
class ColorButtonPlugin : public QObject,                       
public QDesignerCustomWidgetInterface
{
    Q_OBJECT
    Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
    ColorButtonPlugin(QObject *parent = 0);

    QString name() const;
    QString includeFile() const;
    QString group() const;
    QIcon icon() const;
    QString toolTip() const;
    QString whatsThis() const;
    bool isContainer() const;
    QWidget *createWidget(QWidget *parent);
};

Компилю в VS2005.
dll-как копируется в нужную папку, но в самом Designer-е ничего не появляется.


Название: Re: добавление в Designers собственных виджетов
Отправлено: pastor от Апрель 24, 2009, 12:52
Покажи колный код.

Q_EXPORT_PLUGIN2 незабыл?


Название: Re: добавление в Designers собственных виджетов
Отправлено: dr_Begemot от Апрель 24, 2009, 12:58
Покажи колный код.

Q_EXPORT_PLUGIN2 незабыл?

Нет, не забыл...
ColorButtonPlugin.cpp
Код:
#include <QtPlugin>

#include "../ColorButton/ColorButton.h"
#include "ColorButtonPlugin.h"

ColorButtonPlugin::ColorButtonPlugin(QObject *parent)
    : QObject(parent)
{
}

QString ColorButtonPlugin::name() const
{
return "ColorButton";
}

QString ColorButtonPlugin::includeFile() const
{
return "ColorButton.h";
}

QString ColorButtonPlugin::group() const
{
return tr("My widgets");
}

QIcon ColorButtonPlugin::icon() const
{
return QIcon(":/images/iconeditor.png");
}

QString ColorButtonPlugin::toolTip() const
{
return tr("An color button widget");
}

QString ColorButtonPlugin::whatsThis() const
{
return tr("Programmer: Okunev Grigory");
}

bool ColorButtonPlugin::isContainer() const
{
return false;
}

QWidget *ColorButtonPlugin::createWidget(QWidget *parent)
{
return new ColorButton(parent);
}

Q_EXPORT_PLUGIN2(ColorButton, ColorButtonPlugin)


Название: Re: добавление в Designers собственных виджетов
Отправлено: pastor от Апрель 24, 2009, 13:26
Если плугин скопировался туда куда нужно, тогда запусти дизайнер Help->About Plugins, найди свой плугин и глянь в описании что нетак


Название: Re: добавление в Designers собственных виджетов
Отправлено: dr_Begemot от Апрель 24, 2009, 13:31
Если плугин скопировался туда куда нужно, тогда запусти дизайнер Help->About Plugins, найди свой плугин и глянь в описании что нетак

действительно... Он в папке failed plugins...

Там написано: the plugin ... usesincompatible Qt library. Expected build key "Windows msvc release full-config", got "Windows msvc debug full-config"

что надо переделать?


Название: Re: добавление в Designers собственных виджетов
Отправлено: igor_bogomolov от Апрель 24, 2009, 13:33
Попробуйте в файл проекта добавить еще
Код:
CONFIG -= debug
У мяня без этой строчки свой виджеты тоже не появляются.


Название: Re: добавление в Designers собственных виджетов
Отправлено: pastor от Апрель 24, 2009, 13:35
у тебя плугин собран с отладочной информацией (откуда она взялась хз, в профайле у тебя стоит release), попробуй просто пересобрать его.

(n)make clean
qmake
(n)make

После пересборки проверь зависимости (с какими либами он слинковался - с релизными или отладочными)


Название: Re: добавление в Designers собственных виджетов
Отправлено: dr_Begemot от Апрель 24, 2009, 13:49
у тебя плугин собран с отладочной информацией (откуда она взялась хз, в профайле у тебя стоит release), попробуй просто пересобрать его.

(n)make clean
qmake
(n)make

После пересборки проверь зависимости (с какими либами он слинковался - с релизными или отладочными)

Проблема решилась)
CONFIG -= debug
добавлять не стал, а сделал просто
qmake
nmake

и все, виджет появился!

Раньше я делал так:
Создавал проект под VS
qmake -tp vc ColorButtonPlugin.pro

открывал проект VS и компилил в ней... виджет не появлялся... странно... какая разница - командой nmake компилить или Build->rebuild solutions  в VS?



Название: Re: добавление в Designers собственных виджетов
Отправлено: dr_Begemot от Апрель 24, 2009, 13:54
у тебя плугин собран с отладочной информацией (откуда она взялась хз, в профайле у тебя стоит release), попробуй просто пересобрать его.

(n)make clean
qmake
(n)make

После пересборки проверь зависимости (с какими либами он слинковался - с релизными или отладочными)

По ходу еще проблемка появилась...
Добавив на форму мой виджет компилю проект, а он пишет:Cannot open include file: 'ColorButton.h': No such file or directory

Причем #include "ColorButton.h" объявлено в сгенерированном ui_ файле


Название: Re: добавление в Designers собственных виджетов
Отправлено: pastor от Апрель 24, 2009, 15:07
открывал проект VS и компилил в ней... виджет не появлялся... странно... какая разница - командой nmake компилить или Build->rebuild solutions  в VS?

А ты глянь какой тип проекта в студии стоит: дебаг или релиз


Название: Re: добавление в Designers собственных виджетов
Отправлено: dr_Begemot от Апрель 24, 2009, 15:36
А ты глянь какой тип проекта в студии стоит: дебаг или релиз

debug


Название: Re: добавление в Designers собственных виджетов
Отправлено: pastor от Апрель 24, 2009, 17:21
debug

Ну вот ответ на вопрос. Если хочешь компилить со студии, быбирай релиз (плуги к дизайнеру должны быть собраны в релизе)


Название: Re: добавление в Designers собственных виджетов
Отправлено: migel от Май 15, 2009, 08:45
dr_Begemot писал:
По ходу еще проблемка появилась...
Добавив на форму мой виджет компилю проект, а он пишет:Cannot open include file: 'ColorButton.h': No such file or directory
Причем #include "ColorButton.h" объявлено в сгенерированном ui_ файле

У меня получается такая проблема, как с ней бороться кто знает.
Использую куте креатор, добавился виджет туда без проблем, испльзовал пример из ассистана, Custom Widget Plugin Example
тот который AnalogClockPlugin,
бросаю на форму, компилю, пишет тоже саме что неможет найти хедер, ладно прописавю хедер INCLUDEPATH,
вылетает вот что:
project/widget/test/ui_dialog.h:32: undefined reference to `AnalogClock::AnalogClock(QWidget*)
:-1: error: collect2: ld returned 1 exit status
Кто знает как с этим бороться?

Всем спасибо разобрался.


Название: Re: добавление в Designers собственных виджетов
Отправлено: ритт от Май 15, 2009, 09:32
экспорт/импорт забыл?


Название: Re: добавление в Designers собственных виджетов
Отправлено: migel от Май 15, 2009, 09:34
экспорт/импорт забыл?
Либу плагина надо подцепить + ld.so.conf поправил


Название: Re: добавление в Designers собственных виджетов
Отправлено: pastor от Май 15, 2009, 14:14
Либу плагина надо подцепить

А где про такое пишут?


Название: Re: добавление в Designers собственных виджетов
Отправлено: migel от Май 16, 2009, 15:35
Либу плагина надо подцепить

А где про такое пишут?
прописал в про файле проекта где использую плагин libanalogclockplugin.so
unix:LIBS += -L$(HOME)/qtcreator-1.0.0/bin/designer  -lanalogclockplugin
после этого все заработало.

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

Создал свой виджет на основе QTableView,
сортировку и инкрементальный поиск позволяет делать.
Так вот создал плагин куте креатор его подхватил,
но почему то получилось так что функция  QWidget* createWidget(QWidget *parent);
возращает QWidget а не мой класс CustomTable:

QWidget* CustomTablePlugin::createWidget(QWidget *parent)
{
    return new CustomTable(parent);
}

В итоге получается так что в дизайнере я вижу мой виджет но вместо моего класса наблюдаю QWidget,
при запуске вижу пустую форму что и понятно.

Да кстати а в Qt Designer появляется сообщение:
A class name mismatch occurred when creating a widget using the custom widget factory registered for widgets of class CustomTable.
It returned a widget of class QWidget.

Все проблема решена забыл написать Q_OBJECT в классе CustomTable.