Qt 插件框架

近來(lái)學(xué)習(xí)QT的插件框架辕棚,記錄一些心得

1符欠、插件的好處:

基于插件的設(shè)計(jì)好處很多,把擴(kuò)展功能從框架中剝離出來(lái),降低了框架的復(fù)雜度,讓框架更容易實(shí)現(xiàn).擴(kuò)展功能與框架以一種很松的方式耦合,兩者在保持接口不變的情況下,可以獨(dú)立變化和發(fā)布,將軟件的復(fù)雜度限制在了單個(gè)的插件之中,比較適用與需求不定或是業(yè)務(wù)容易發(fā)生變化的軟件設(shè)計(jì).


image.png

2夏块、構(gòu)建插件框架

2.1主程序

2.1.1接口
//step 1 定義接口
class MainInterface
{
public:
    virtual ~MainInterface(){}
    virtual QString name() = 0;
    virtual QString information() = 0;
   //返回一個(gè)Widget設(shè)置到centerwidget中進(jìn)行顯示  
    virtual QWidget *centerWidget() = 0; 
};
//step 2 聲明接口
#define MainInterface_iid "com.Interface.MainInterface"
Q_DECLARE_INTERFACE(MainInterface, MainInterface_iid)
2.1.2 主程序加載接口
/**
 * @brief MainWindow::loadPlugins 加載插件蠢护、插件放在plugins文件夾下
 * @return 返回插件的個(gè)數(shù)
 */
int MainWindow::loadPlugins()
{
    int count  = 0;
    QDir pluginsDir = QDir(qApp->applicationDirPath());
    if(!pluginsDir.cd("plugins")) return -1;
    foreach (QString fileName, pluginsDir.entryList(QDir::Files))
    {
        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
        QObject *plugin = pluginLoader.instance();
        if(plugin)
        {
            auto centerInterface = qobject_cast<MainInterface*>(plugin);
            if(centerInterface)
            {
                ++count;
                //加載插件后生成menu
                populateMenus(plugin,centerInterface);
            }
        }
    } 
    return count;
}

/**
 * @brief MainWindow::populateMenus 根據(jù)插件生成menu
 * @param pluginInterface 插件
 * @param i 插件實(shí)現(xiàn)的接口
 */
void MainWindow::populateMenus(QObject * pluginInterface,MainInterface*i )
{
    static auto menu = menuBar()->addMenu("widgets");
    auto act  = new QAction(i->name(),pluginInterface);
    //單擊menu調(diào)用插件
    connect(act,&QAction::triggered,this,&MainWindow::slt_WidgetActionTriggered);
    menu->addAction(act);
}

/**
 * @brief MainWindow::slt_WidgetActionTriggered 單擊menu調(diào)用插件
 */
void MainWindow::slt_WidgetActionTriggered()
{
    auto centerWidget = qobject_cast<MainInterface*>(sender()->parent())->centerWidget();
    setCentralWidget(centerWidget);
}

2.2 接口實(shí)現(xiàn)

class CENTERWIDGETTWOSHARED_EXPORT CenterWidgetTwo
        :public QObject
        ,public MainInterface
{
    Q_OBJECT
    //Q_INTERFACES 宏用于告訴 Qt 該類(lèi)實(shí)現(xiàn)的接口惕蹄。
    Q_INTERFACES(MainInterface)
    //Q_PLUGIN_METADATA宏用于描述插件元數(shù)據(jù)
    Q_PLUGIN_METADATA(IID MainInterface_iid) 
    
public:
    CenterWidgetTwo();
    ~CenterWidgetTwo();
    //實(shí)現(xiàn)虛函數(shù)
    virtual QString name() override;
    virtual QString information() override;
    virtual QWidget *centerWidget() override;
};
QWidget *CenterWidgetTwo::centerWidget()
{
    auto btn = new QPushButton("Two");
    return  btn;
}

程序截圖

加載界面1


image.png

加載界面2


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绎狭,一起剝皮案震驚了整個(gè)濱河市关带,隨后出現(xiàn)的幾起案子侥涵,更是在濱河造成了極大的恐慌,老刑警劉巖宋雏,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芜飘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡磨总,警方通過(guò)查閱死者的電腦和手機(jī)嗦明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚪燕,“玉大人娶牌,你說(shuō)我怎么就攤上這事奔浅。” “怎么了诗良?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵汹桦,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鉴裹,道長(zhǎng)舞骆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任径荔,我火速辦了婚禮督禽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猖凛。我一直安慰自己赂蠢,他們只是感情好绪穆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布辨泳。 她就那樣靜靜地躺著,像睡著了一般玖院。 火紅的嫁衣襯著肌膚如雪菠红。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼誉帅。 笑死痘昌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的暇韧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摹闽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起褐健,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤付鹿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蚜迅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舵匾,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年谁不,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坐梯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刹帕,死狀恐怖吵血,靈堂內(nèi)的尸體忽然破棺而出馏段,到底是詐尸還是另有隱情,我是刑警寧澤践瓷,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布院喜,位于F島的核電站,受9級(jí)特大地震影響晕翠,放射性物質(zhì)發(fā)生泄漏喷舀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一淋肾、第九天 我趴在偏房一處隱蔽的房頂上張望硫麻。 院中可真熱鬧,春花似錦樊卓、人聲如沸拿愧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浇辜。三九已至,卻和暖如春唾戚,著一層夾襖步出監(jiān)牢的瞬間柳洋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工叹坦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熊镣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓募书,卻偏偏與公主長(zhǎng)得像绪囱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子莹捡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,756評(píng)論 25 707
  • 1鬼吵、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 第十九品 法界通化分 須菩提。于意云何道盏。若有人滿(mǎn)三千大千世界七寶而柑。以用布施。是人以是因緣荷逞。得福多不媒咳。如是。世尊种远。此...
    笑看流年閱讀 437評(píng)論 0 0
  • 晚睡涩澡,21世紀(jì)以來(lái),人類(lèi)社會(huì)的病坠敷。 在平時(shí)的閑聊話(huà)題中妙同,關(guān)于晚睡射富,是我所在的社交圈里面人的常態(tài)。 大家真的很努力呢...
    不負(fù)明月_只爭(zhēng)朝夕閱讀 181評(píng)論 0 0
  • 大家好粥帚,我是來(lái)自武漢的deviche胰耗,目前關(guān)注安卓技術(shù)。來(lái)簡(jiǎn)書(shū)這么久芒涡,看了很多不錯(cuò)的博客柴灯,希望和大家學(xué)習(xí)交流。 1...
    deviche閱讀 304評(píng)論 0 0