2014-03-13 40 views
2

我正在嘗試創建一個包含兩個QtDesigner插件的DLL「CustomPlugins」。通過複製WorldClockPlugin示例,我可以讓每個插件單獨工作。然而,當我嘗試包括他們在一個單一的DLL,我得到下面的生成錯誤:未能構建多部件QtDesigner插件

LNK2005: _qt_plugin_instance already defined in moc_qledplugin.obj 

在我看來,通過使我的插件封裝部件既繼承QDesignerCustomWidgetInterface它導致的多重定義_qt_plugin_instance函數。我查看了moc文件和customwidget頭文件(包含在QDesignerCustomWidgetInterface中),但找不到對此函數的任何引用。

QDesignerExportWidget包含在兩個插件標頭中,而QDESIGNER_WIDGET_EXPORT包含在兩個插件聲明中。

是不是可以將兩個插件包裝在同一個DLL中?或者我錯過了什麼?

謝謝。

以下是驗證碼。 qdragabletoolboxplugin。*文件(未顯示)幾乎與qledplugin *文件相同。此外,qdragabletoolbox(也未顯示)與qled的聲明方式相同,但顯然會做出非常不同的事情。爲了節省空間,我放棄了這些文件,並用橢圓替換了一些函數定義。

.pro文件:

QT   += widgets designer 

QMAKE_LFLAGS += /INCREMENTAL:NO 

TARGET  = $$qtLibraryTarget($$TARGET) 
CONFIG  += plugin 
TEMPLATE = lib 

target.path = $$[QT_INSTALL_PLUGINS]/designer 
INSTALLS += target 

HEADERS  = qled.h \ 
       qledplugin.h \ 
       qdragabletoolbox.h \ 
       qdragabletoolboxplugin.h 
SOURCES  = qled.cpp \ 
       qledplugin.cpp \ 
       qdragabletoolbox.cpp \ 
       qdragabletoolboxplugin.cpp 

RESOURCES += CustomDesignerPlugins.qrc 

qled.h:

#ifndef QLED_H 
#define QLED_H 

#include <QWidget> 
#include <QPaintEvent> 
#include <QPainter> 
#include <QList> 
#include <QColor> 
#include <QGradient> 
#include <QtDesigner/QDesignerExportWidget> 

class QDESIGNER_WIDGET_EXPORT QLED : public QWidget 
{ 
    Q_OBJECT 

    Q_ENUMS(ledColor) 
    Q_ENUMS(ledShape) 

    Q_PROPERTY(ledColor offColor READ offColor WRITE setOffColor) 
    Q_PROPERTY(ledColor onColor READ onColor WRITE setOnColor) 
    Q_PROPERTY(bool shadow READ shadow WRITE setShadow) 
    Q_PROPERTY(ledShape shape READ shape WRITE setShape) 
    Q_PROPERTY(bool value READ value WRITE setValue) 

public: 
    enum ledColor { Red = 0, Orange, Yellow, Green, Blue, Indigo, Violet, Black, Gray, DarkGray }; 
    enum ledShape { Ellipse = 0, Rectangle, Circle, Square }; 

    explicit QLED(QWidget *parent = NULL); 
    virtual ~QLED() { /*empty*/ } 

    bool value() const { return mValue; } 
    ledColor onColor() const { return mOnColor; } 
    ledColor offColor() const { return mOffColor; } 
    ledShape shape() const { return mShape; } 
    bool shadow() const { return mShadow; } 

signals: 

public slots: 
    void setValue(bool value) { mValue = value; update(); } 
    void setShape(ledShape shape) { mShape = shape; update(); } 
    void setOnColor(ledColor color) { mOnColor = color; update(); } 
    void setOffColor(ledColor color) { mOffColor = color; update(); } 
    void setShadow(bool b) { mShadow = b; update(); } 
    void toggle() { mValue = !mValue; update(); } 

protected: 
    void paintEvent(QPaintEvent *event); 

private: 
    void drawBezel(QPainter *painter); 
    void drawFace(QPainter *painter); 
    void drawShadow(QPainter *painter); 

private: 
    bool mValue; 

    ledColor mOnColor; 
    ledColor mOffColor; 

    bool mBezel; 
    float mBezelWidth; 
    ledColor mBezelColor; 

    bool mShadow; 

    ledShape mShape; 

    QList<QColor> colors; 
}; 

#endif 

qled.cpp

#include "qled.h" 

QLED::QLED(QWidget *parent) 
    : QWidget(parent) 
{ 
    ... 
} 

void QLED::paintEvent(QPaintEvent *event) 
{ 
    ... 
} 

void QLED::drawBezel(QPainter *painter) 
{ 
    ... 
} 

void QLED::drawFace(QPainter *painter) 
{ 
    ... 
} 

void QLED::drawShadow(QPainter *painter) 
{ 
    ... 
} 

qledplugin.h

#ifndef QLEDPLUGIN_H 
#define QLEDPLUGIN_H 

#include <QDesignerCustomWidgetInterface> 

class QLEDPlugin : public QObject, public QDesignerCustomWidgetInterface 
{ 
    Q_OBJECT 
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface" FILE "qled.json") 
    Q_INTERFACES(QDesignerCustomWidgetInterface) 

public: 
    QLEDPlugin(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 initialized; 
}; 

#endif 

qledplugin.cpp

#include "qled.h" 
#include "qledplugin.h" 

#include <QtPlugin> 

QLEDPlugin::QLEDPlugin(QObject *parent) 
    : QObject(parent) 
{ 
    initialized = false; 
} 

void QLEDPlugin::initialize(QDesignerFormEditorInterface *core) 
{ 
    Q_UNUSED(core); 
    if (initialized) 
     return; 
    else 
     initialized = true; 
} 

bool QLEDPlugin::isInitialized() const 
{ 
    return initialized; 
} 

QWidget *QLEDPlugin::createWidget(QWidget *parent) 
{ 
    return new QLED(parent); 
} 

QString QLEDPlugin::name() const 
{ 
    return QLatin1String("QLED"); 
} 

QString QLEDPlugin::group() const 
{ 
    return QLatin1String("Display Widgets"); 
} 

QIcon QLEDPlugin::icon() const 
{ 
    return QIcon(QLatin1String(":/QLED/LEDIcon.png")); 
} 

QString QLEDPlugin::toolTip() const 
{ 
    return "Binary status indicator"; 
} 

QString QLEDPlugin::whatsThis() const 
{ 
    return ""; 
} 

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

QString QLEDPlugin::domXml() const 
{ 
    return "<ui language=\"c++\">\n" 
      " <widget class=\"QLED\" name=\"qLed\">\n" 
      " <property name=\"geometry\">\n" 
      " <rect>\n" 
      " <x>0</x>\n" 
      " <y>0</y>\n" 
      " <width>25</width>\n" 
      " <height>25</height>\n" 
      " </rect>\n" 
      " </property>\n" 
      " </widget>\n" 
      "</ui>";; 
} 

QString QLEDPlugin::includeFile() const 
{ 
    return QLatin1String("QtWidgets/QLED.h"); 
} 

回答

3

編譯器錯誤信息給你你需要的所有信息:你有兩個小部件,但你只需要一個插件。

而不是實施QDesignerCustomWidgetInterface,實施QDesignerCustomWidgetCollectionInterface