• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::
            From: http://blog.csdn.net/henreash/article/details/7264489@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

            創(chuàng)建一個(gè)QT的庫項(xiàng)目,刪除自動生成的.h和.cpp文件,添加一個(gè)接口定義.h文件和一個(gè)接口實(shí)現(xiàn)類(一個(gè).h一個(gè).cpp).代碼如下:

            1.接口文件源碼

            #ifndef PLUGININTERFACE_H
            #define PLUGININTERFACE_H

            #include <QString>


            class EchoInterface
            {
            public:
             virtual ~EchoInterface() {}
             virtual QString echo(const QString &message) = 0;
            };

            QT_BEGIN_NAMESPACE
            Q_DECLARE_INTERFACE(EchoInterface, "com.hollysys.plugin.EchoIntrface/1.0");
            QT_END_NAMESPACE


            #endif

            2.接口實(shí)現(xiàn)類頭文件

            #ifndef PLUGIN_H
            #define PLUGIN_H

            //#include "plugin_global.h"
            #include <QObject>
            #include "plugininterface.h"

            class Plugin : public QObject, EchoInterface
            {
             Q_OBJECT
             Q_INTERFACES(EchoInterface)
            public:
             Plugin();
             ~Plugin();
            public:
             QString echo(const QString &message);


            };

            #endif // PLUGIN_H

            3.接口實(shí)現(xiàn)類cpp文件

            #include "plugin.h"
            #include <QtGui>


            Plugin::Plugin()
            {

            }

            Plugin::~Plugin()
            {

            }

            QString Plugin::echo(const QString &message)
            {
             return message;
            }

            Q_EXPORT_PLUGIN2("echoPlugin", Plugin);

            編譯生成dll格式的插件.這里可能會遇到LNK2001錯(cuò)誤,因?yàn)椴寮涌诙x依賴于QT的元數(shù)據(jù),而在代碼中手動添加Q_OBJECT宏后,編譯器不會自動為我們生成moc_XXXX.cpp文件,因此需要使用命令行生成moc元數(shù)據(jù)文件:cmd-->cd 源碼所在命令 -->moc -o moc_XXXX.cpp XXXX.h.這樣就可以手動創(chuàng)建出moc元數(shù)據(jù)文件,解決LNK2001編譯錯(cuò)誤.

            建立一個(gè)GUI測試項(xiàng)目,代碼如下:

            #include "test.h"
            #include <QtGui>
            #include <QMessageBox>
            #include <QDir>

            Test::Test(QWidget *parent, Qt::WFlags flags)
             : QMainWindow(parent, flags)
            {
             ui.setupUi(this);
             QObject::connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(ButtonClicked()));
             loadPlugin();
            }

            Test::~Test()
            {

            }

            bool Test::loadPlugin()
            {
             QDir pluginsDir(qApp->applicationDirPath());
             foreach (QString filename, pluginsDir.entryList(QDir::Files))
             {
              QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(filename));
              QObject *plugin = pluginLoader.instance();
              if(plugin)
              {
               echoInterface = qobject_cast<EchoInterface *>(plugin);//echoInterface是成員變量
               if(echoInterface)
                return true;
              }
             }
            }

            void Test::ButtonClicked()
            {
             QString plugin = ui.lineEdit->text();
             QMessageBox::information(NULL, "", echoInterface->echo(plugin));
            }

            分析代碼可見,這里對所有與exe文件同目錄的文件嘗試加載插件,如果加載成功則返回.代碼實(shí)現(xiàn)非常簡潔.在正式開發(fā)中可將已加載的插件接口存放在列表中,在需要的時(shí)候依次調(diào)用即可.

            另外如果想獲取插件中類定義的元數(shù)據(jù),可以使插件接口類從QObject繼承,并使用Q_CLASSINFO宏添加鍵值對,如Q_CLASSINFO("Author**", "Henreash**").并從主程序中使用插件對象元數(shù)據(jù)獲取這些鍵值對:

             const QMetaObject *mo = echoInterface->metaObject();
             for(int i = 0; i < mo->classInfoCount(); i++)
             {
              qDebug() << mo->classInfo(i).name() << mo->classInfo(i).value();
             }

            使用這個(gè)機(jī)制可以在定義插件類的時(shí)候向主程序傳遞一些特殊信息.

            測試發(fā)現(xiàn),如果在插件接口類中定義一個(gè)靜態(tài)變量,那么這個(gè)靜態(tài)變量在插件中的地址和在主程序中的地址是不相同的.

            posted on 2013-06-25 23:26 逛奔的蝸牛 閱讀(2053) 評論(0)  編輯 收藏 引用 所屬分類: C/C++Qt
            国产69精品久久久久9999| 久久精品国产亚洲Aⅴ蜜臀色欲| 丁香五月综合久久激情| 久久中文精品无码中文字幕| 久久久久久久久久久精品尤物 | 精品久久久久久久久免费影院 | 久久久久国产精品麻豆AR影院| 久久亚洲国产成人影院| AV无码久久久久不卡网站下载| 亚洲国产精品久久久久婷婷老年| 久久亚洲精品人成综合网| 欧美日韩精品久久免费| 亚洲性久久久影院| 久久久久无码专区亚洲av| 国产aⅴ激情无码久久| 日本精品一区二区久久久| 久久综合香蕉国产蜜臀AV| 热RE99久久精品国产66热| 久久免费看黄a级毛片| 午夜视频久久久久一区 | 久久国产精品波多野结衣AV| 无码日韩人妻精品久久蜜桃| 国产亚洲美女精品久久久| 人妻精品久久无码区| 久久精品水蜜桃av综合天堂| 久久无码精品一区二区三区| 国产人久久人人人人爽| 久久久免费观成人影院| 狠狠色丁香久久综合婷婷| 久久久久久综合网天天| 久久精品国产黑森林| 91精品国产91久久久久福利| 久久精品国产亚洲av麻豆蜜芽| 国产农村妇女毛片精品久久| 久久久久人妻一区二区三区vr| 中文字幕精品久久久久人妻| 国产叼嘿久久精品久久| 国产精品18久久久久久vr | 伊人久久综合热线大杳蕉下载| 无码人妻久久一区二区三区免费 | 久久九九亚洲精品|