Why custom widget can't be added to Qt Designer's plugin
-
The book Foundations of Qt Development said after building the custom widget plugin project,the widget will be added to Qt Designer as plugin.But when I built the book's example project,I can't find widget in Qt Designer and building succeeded. My Qt Creator is 2.4.1
-
Your plugin needs to be build with the exact same configuration as your IDE (designer/creator). That means: using the same Qt version, the same compiler and the same compiler settings. Is that the case?
You can see the overview of plugins from Creator. Open a designer window, and go to the Tools Menu -> Form Editor -> About Qt Designer plugins...
You will get a tree with the plugins found, and also see what problems there are with the ones that can't be loaded.
-
I did as what you said,and I can't find my plugin in Plugin Information dialog.Here is the book's example code
plugin.pro@TEMPLATE = lib
CONFIG += designer plugin releaseDEPENDPATH += .
TARGET = circlebarplugin
HEADERS += circlebar.h circlebarplugin.h
SOURCES += circlebar.cpp circlebarplugin.cppDESTDIR = $$[QT_INSTALL_DATA]/plugins/designer
FORMS +=
@circlebar.h
@#ifndef CIRCLEBAR_H
#define CIRCLEBAR_H#include <QWidget>
#include <QtDesigner>class QDESIGNER_WIDGET_EXPORT CircleBar : public QWidget
{
Q_OBJECTpublic:
CircleBar( QWidget *parent = 0 );
CircleBar( int value = 0, QWidget *parent = 0 );int value() const;
int heightForWidth( int ) const;
QSize sizeHint() const;
public slots:
void setValue( int );signals:
void valueChanged( int );protected:
void paintEvent( QPaintEvent* );
void wheelEvent( QWheelEvent* );private:
int m_value;
};#endif // CIRCLEBAR_H
@ -
circlebar.cpp
@#include <QPaintEvent>
#include <QWheelEvent>#include <QPainter>
#include "circlebar.h"
CircleBar::CircleBar( QWidget *parent ) : QWidget( parent )
{
m_value = 0;QSizePolicy policy( QSizePolicy::Preferred, QSizePolicy::Preferred );
policy.setHeightForWidth( true );
setSizePolicy( policy );
}CircleBar::CircleBar( int value, QWidget *parent ) : QWidget( parent )
{
m_value = value;QSizePolicy policy( QSizePolicy::Preferred, QSizePolicy::Preferred );
policy.setHeightForWidth( true );
setSizePolicy( policy );
}int CircleBar::heightForWidth( int width ) const
{
return width;
}QSize CircleBar::sizeHint() const
{
return QSize( 100, 100 );
}int CircleBar::value() const
{
return m_value;
}void CircleBar::setValue( int value )
{
if( value < 0 )
value = 0;if( value > 100 )
value = 100;if( m_value == value )
return;m_value = value;
update();
emit valueChanged( m_value );
}void CircleBar::paintEvent( QPaintEvent *event )
{
int radius = width()/2;
double factor = m_value/100.0;QPainter p( this );
p.setPen( Qt::black );
p.drawEllipse( 0, 0, width()-1, width()-1 );
p.setBrush( Qt::black );
p.drawEllipse( int(radius*(1.0-factor)), int(radius*(1.0-factor)), int((width()-1)*factor)+1, int((width()-1)*factor)+1 );
}void CircleBar::wheelEvent( QWheelEvent *event )
{
event->accept();
setValue( value() + event->delta()/20 );
}@ -
circlebarplugin.h
@#ifndef CIRCLEBARPLUGIN_H
#define CIRCLEBARPLUGIN_H#include <QDesignerCustomWidgetInterface>
class QExtensionManager;
class CircleBarPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)public:
CircleBarPlugin( QObject *parent = 0 );bool isContainer() const; bool isInitialized() const; QIcon icon() const; QString codeTemplate() 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 /* CIRCLEBARPLUGIN_H */@
circlebarplugin.cpp
@#include <QtPlugin>
#include <QExtensionManager>
#include <QDesignerFormEditorInterface>
#include <QTimer>#include "circlebar.h"
#include "circlebarplugin.h"CircleBarPlugin::CircleBarPlugin( QObject *parent )
{
m_initialized = false;
}bool CircleBarPlugin::isInitialized() const
{
return m_initialized;
}void CircleBarPlugin::initialize( QDesignerFormEditorInterface *core )
{
if( m_initialized )
return;m_initialized = true;
}
bool CircleBarPlugin::isContainer() const
{
return false;
}QIcon CircleBarPlugin::icon() const
{
return QIcon();
}QString CircleBarPlugin::toolTip() const
{
return "";
}QString CircleBarPlugin::whatsThis() const
{
return "";
}QString CircleBarPlugin::codeTemplate() const
{
return "";
}QString CircleBarPlugin::includeFile() const
{
return "circlebar.h";
}QString CircleBarPlugin::name() const
{
return "CircleBar";
}QString CircleBarPlugin::domXml() const
{
return "<widget class="CircleBar" name="circleBar">\n"
"</widget>\n";
}QString CircleBarPlugin::group() const
{
return "Book Widgets";
}QWidget *CircleBarPlugin::createWidget( QWidget *parent )
{
return new CircleBar( parent );
}Q_EXPORT_PLUGIN2( circleBarPlugin, CircleBarPlugin )@