• 6418阅读
  • 2回复

about custom plugin(dll). [复制链接]

上一主题 下一主题
离线lee51525125
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-19
there is question that can I implement a custom plugin that the QUiLoader
can load it? actually I know QDesignerCustomWidgetInterface class can reach this
goal. but it likes big :I wantn't use my custom by designer or more,this is my example:
customInterface.h---
    class QWidget;
    class QString;
    class CustomInterface
    {
    public:
        virtual ~CustomInterface() {}
        virtual QString name() const = 0;
        virtual QWidget *createWidget(QWidget *parent) = 0;
    };
    Q_DECLARE_INTERFACE(CustomInterface, "com.www.custonminterface")
weatherPlugin.h----
    #ifndef WEATHERPLUGIN_H_
    #define WEATHERPLUGIN_H_

    #include <QtGui>
    #include "customInterface.h"
    class WeatherPlugin : public QObject, public CustomInterface
    {
        Q_OBJECT
        Q_INTERFACES(CustomInterface)

    public:
        WeatherPlugin(QObject *parent = 0);
        bool isInitialized() const;
        QString name() const;
        QWidget *createWidget(QWidget *parent);

    private:
        bool initialized;
    };
#endif /*WEATHERPLUGIN_H_*/
weatherPlugin.cpp----
    #include "../Header/weatherPlugin.h"
    #include "../Header/Weather.h"
    #include <QtPlugin>

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

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

    QWidget *WeatherPlugin::createWidget(QWidget *parent)
    {
        return new Weather(parent);
    }

    QString WeatherPlugin::name() const
    {
        return "Weather";
    }

Q_EXPORT_PLUGIN2(Weather, WeatherPlugin)

Weather.h---
    class Weather : public QWidget
    {
        Q_OBJECT
    public:
        Weather(QWidget *parent = 0){};
        ~Weather(){};
    };

main.cpp
    #include <QtGui>
    #include <QUiLoader>
    #include <QDebug>
    int main(int argc,char **argv)
    {
        QApplication app(argc, argv);
        QWidget *man=NULL;
        QUiLoader *lo=new QUiLoader;
        lo->addPluginPath("./ddd");//the dir I have test for other dll implement by QDesignerCustomWidgetInterface it's right.
        qDebug()<<lo->availableWidgets ()<<"--------"<<lo->availableWidgets ().count()<<lo->pluginPaths () ;
        man=lo->createWidget("Weather");
        man->show();
        return app.exec();
    }
.is there some other way to implement my idea?
离线lee51525125
只看该作者 1楼 发表于: 2009-11-20
哪门没得人理我呀?那我用中文说一下:
如果我想实现一个UI类插件 想用QUiloder 加载它 < 行不.已经知道QDesignerCustomWidgetInterface可以实现我的要求但是
我觉的有点大,而且我有没必要让qdesigner 知道和使用& 感觉没有必要。
customInterface.h---
    class QWidget;
    class QString;
    class CustomInterface
    {
    public:
        virtual ~CustomInterface() {}
        virtual QString name() const = 0;
        virtual QWidget *createWidget(QWidget *parent) = 0;
    };
    Q_DECLARE_INTERFACE(CustomInterface, "com.www.custonminterface")
myPlugin.h----

    #include <QtGui>
    #include "customInterface.h"
    class MyPlugin : public QObject, public CustomInterface
    {
        Q_OBJECT
        Q_INTERFACES(CustomInterface)

    public:
        MyPlugin(QObject *parent = 0);
        bool isInitialized() const;
        QString name() const;
        QWidget *createWidget(QWidget *parent);

    private:
        bool initialized;
    };

myPlugin.cpp----
    #include "../Header/MyPlugin.h"
    #include "../Header/MyWidget.h"
    #include <QtPlugin>

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

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

    QWidget *MyPlugin::createWidget(QWidget *parent)
    {
        return new MyWidget(parent);
    }

    QString MyPlugin::name() const
    {
        return "MyWidget";
    }

Q_EXPORT_PLUGIN2(MyWidget, MyPlugin)

MyWidget.h---
    class MyWidget : public QWidget
    {
        Q_OBJECT
    public:
        MyWidget(QWidget *parent = 0){};
        ~MyWidget(){};
    };

main.cpp
    #include <QtGui>
    #include <QUiLoader>
    #include <QDebug>
    int main(int argc,char **argv)
    {
        QApplication app(argc, argv);
        QWidget *man=NULL;
        QUiLoader *lo=new QUiLoader;
        lo->addPluginPath("./ddd");//路径是指定好了的,还有debug,release版本也不存在问题,因为我用QDesignerCustomWidgetInterface是完全可以实现的×_×
        qDebug()<<lo->availableWidgets ()<<"--------"<<lo->availableWidgets ().count()<<lo->pluginPaths () ;
        man=lo->createWidget("MyWidget");
        man->show();
        return app.exec();
    }
离线foxyz

只看该作者 2楼 发表于: 2009-11-20
首先,我还真没明白你想问什么.
custom plugin that the QUiLoader can load it?   当然可以.没问题,管你是QT自己的plugin还是你的custom plugin
快速回复
限100 字节
 
上一个 下一个