Boujour à tous.
Voila donc, j'essaye d'inclure un widget dans les plugins de qt designer de la même façon que les widget "typiques" (genre QPushButton).
Après plusieurs essais en suivant la doc (creating custom widget for Qt designer), j'ai finit par utiliser le "générateur"(je sais pas comment ça s'appelle) de Qt creator "Widget personnalisé pour Qt4 designer".
Ainsi, il me génère 4 fichiers, comme dans la doc:
-> ImageButton.hpp
-> ImageButton.cpp
-> ImageButtonPlugin.hpp
-> ImageButtonPlugin.cpp
-> Qt_Custom_Widgets.pro
Bref, que du classique ! J'ai vérifié avec la doc, tout correspond parfaitement, toutes les fonctions à définir dans la description de mon widget sont remplies correctement et le .pro semble convenir.
Le projet compile (MinGW) me génère ma dll et mon .a dans un dossier voisin de mes sources, je les copie dans le dossier Qt/qt/plugins/designer mais rien ne s'affiche dans Qt designer.
-> Je compile en release
-> Je définit la cible (TARGET) comme $$qtLibraryTarget(ImageButtonPlugin), puis le target.path dans: $$[QT_INSTALL_PLUGINS]/designer
-> J'ai bien les macros Q_INTERFACES(QDesignerCustomWidgetInterface) dans le .hpp du descripteur
et Q_EXPORT_PLUGIN2(ImageButtonPlugin, ImageButtonPlugin) dans l e .cpp du constructeur.
-> Mon widget à intégrer ne fait absoluement rien (C'est juste une classe qui hérite de QPushButton en ne faisant rien de plus)
-> Je compile sous Qt creator avec MinGW
-> Qt creator (enfin, tout le SDK) est en version 32 bits et je suis sous Window 7 64bits.
-> J'ai spécifié une icone bien visible pour représenter le widget dans Qt designer (pour pas le louper)
Il y a quand même plusieurs choses qui m'ont semblées étranges:
-> Il ne m'a rien généré dans le dossier Qt/qt/plugins/designer, même en lançant Qt creator en mode administrateur.
-> La première fois que Qt creator a compilé le projet, il a demandé un exécutable. Pensant qu'il s'agissait de l'executable pour générer le plugin, j'ai donné qmake.exe, peut-être une erreur ?
Voila, je suis à court d'idée car il m'a semblé suivre la doc à la lettre (en essayant ensuite d'autres trucs au fil des forums visités) et que je ne fais rien de plus ou de moins.
J'ai l'impréssion qu'il s'agit d'une connerie ou d'un truc auquel je suis passé à coté, mais j'arrive pas à voir quoi.
Merci d'avance pour vos réponses.
Voici mon code, au cas où:
Qt_Custom_Widgets.pro
ImageButtonPlugin.hpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 QT += core gui CONFIG += designer plugin debug_and_release TARGET = $$qtLibraryTarget(ImageButtonPlugin) TEMPLATE = lib HEADERS = ImageButtonPlugin.hpp SOURCES = ImageButtonPlugin.cpp RESOURCES = icons.qrc LIBS += -L. target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target DEFINES += _DESIGNER_EXPORT include(ImageButton.pri)
ImageButtonPlugin.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 #ifndef IMAGEBUTTONPLUGIN_HPP #define IMAGEBUTTONPLUGIN_HPP #include <QDesignerCustomWidgetInterface> #include "ImageButton.hpp" class ImageButtonPlugin : public QObject, public QDesignerCustomWidgetInterface { Q_OBJECT Q_INTERFACES(QDesignerCustomWidgetInterface) public: ImageButtonPlugin(QObject *parent = 0); bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString domXml() const; QString group() const; QString includeFile() const; QString name() const; QString toolTip() const; QString whatsThis() const; QWidget *createWidget(QWidget *parent); void initialize(QDesignerFormEditorInterface *core); private: bool m_initialized; }; #endif
Et enfin: ImageButton.hpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 #include "ImageButtonPlugin.hpp" #include <QtCore/QtPlugin> #include <QString> ImageButtonPlugin::ImageButtonPlugin(QObject *parent) : QObject(parent) { m_initialized = false; } void ImageButtonPlugin::initialize(QDesignerFormEditorInterface * /* core */) { if (m_initialized) return; m_initialized = true; } bool ImageButtonPlugin::isInitialized() const { return m_initialized; } QWidget *ImageButtonPlugin::createWidget(QWidget *parent) { return new ImageButton(parent); } QString ImageButtonPlugin::name() const { return QLatin1String("ImageButton"); } QString ImageButtonPlugin::group() const { return QLatin1String("Buttons"); } QIcon ImageButtonPlugin::icon() const { return QIcon(":/icons/imageButtonIcon.ico"); } QString ImageButtonPlugin::toolTip() const { return QLatin1String("A button represented by an image."); } QString ImageButtonPlugin::whatsThis() const { return QLatin1String("The button is represented by a ratio fixed, scalable image."); } bool ImageButtonPlugin::isContainer() const { return false; } QString ImageButtonPlugin::domXml() const { return "<ui language=\"c++\"> \n" " <widget class=\"ImageButton\" name=\"ImageButton\">\n" "</ui>\n" ; } QString ImageButtonPlugin::includeFile() const { return QLatin1String("ImageButton.hpp"); } Q_EXPORT_PLUGIN2(ImageButtonPlugin, ImageButtonPlugin)
P.S. J'ai pas mis ImageButton.cpp (absolument rien de particulier)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #ifndef IMAGEBUTTON_HPP #define IMAGEBUTTON_HPP #ifdef _DESIGNER_EXPORT #include <QDesignerExportWidget> #else #define QDESIGNER_WIDGET_EXPORT #endif #include <QtGui/QPushButton> class QDESIGNER_WIDGET_EXPORT ImageButton : public QPushButton { Q_OBJECT public: ImageButton(QWidget *parent = 0); }; #endif
P.P.S. Désolé pour la quantité de code, j'ai pas trouvé comment "rapplatir" à l'écrant ces parties.
Partager