QT外掛程式開發方式

2021-07-11 02:34:40 字數 1747 閱讀 4029

建立乙個qt的庫專案,刪除自動生成的.h和.cpp檔案,新增乙個介面定義.h檔案和乙個介面實現類(乙個.h乙個.cpp).**如下:

1.介面檔案原始碼

#ifndef plugininte***ce_h

#define plugininte***ce_h

#include

class echointe***ce

virtual qstring echo(const qstring &message) = 0;

};qt_begin_namespace

q_declare_inte***ce(echointe***ce, "com.hollysys.plugin.echoint***ce/1.0");

qt_end_namespace

#endif

2.介面實現類標頭檔案

#ifndef plugin_h

#define plugin_h

//#include "plugin_global.h"

#include

#include "plugininte***ce.h"

class plugin : public qobject, echointe***ce

;#endif // plugin_h

3.介面實現類cpp檔案

#include "plugin.h"

#include

plugin::plugin()

plugin::~plugin()

qstring plugin::echo(const qstring &message)

q_export_plugin2("echoplugin", plugin);

編譯生成dll格式的外掛程式.這裡可能會遇到lnk2001錯誤,因為外掛程式介面定義依賴於qt的元資料,而在**中手動新增q_object巨集後,編譯器不會自動為我們生成moc_***x.cpp檔案,因此需要使用命令列生成moc元資料檔案:cmd-->cd 原始碼所在命令 -->moc -o moc_***x.cpp ***x.h.這樣就可以手動建立出moc元資料檔案,解決lnk2001編譯錯誤.

建立乙個gui測試專案,**如下:

#include "test.h"

#include

#include

#include

test::test(qwidget *parent, qt::wflags flags)

: qmainwindow(parent, flags)

test::~test()

void test::buttonclicked()

分析**可見,這裡對所有與exe檔案同目錄的檔案嘗試載入外掛程式,如果載入成功則返回.**實現非常簡潔.在正式開發中可將已載入的外掛程式介面存放在列表中,在需要的時候依次呼叫即可.

另外如果想獲取外掛程式中類定義的元資料,可以使外掛程式介面類從qobject繼承,並使用q_classinfo巨集新增鍵值對,如q_classinfo("author**", "henreash**").並從主程式中使用外掛程式物件元資料獲取這些鍵值對:

const qmetaobject *mo = echointe***ce->metaobject();

for(int i = 0; i < mo->classinfocount(); i++)

使用這個機制可以在定義外掛程式類的時候向主程式傳遞一些特殊資訊.

測試發現,如果在外掛程式介面類中定義乙個靜態變數,那麼這個靜態變數在外掛程式中的位址和在主程式中的位址是不相同的.

from:  

GIS開發方式

gis小白,正在慢慢學習。如有不對不妥的地方,請大家指出。總結一下gis的開發方式 1 底層開發 c,c 難度很大,所需的人力物力要多。是跟硬體 動態庫 函式庫打交道的底層開發。大多數情況下不會採用這種方式。2 二次開發 vb,vc c 等 1 嵌入式開發 非gis專業人員常採用的技術之一 只有少數...

Drupal的開發方式

drupal是乙個強大的 靈活的cms開發平台,它有自己獨特的開發方式,按照它的方式進行開發,則事半功倍。相反,如果只是把它當成普通的php專案,一上來就對它進行修改 或直接通過編碼來新增功能,那就將是一場災難,下面是我在做drupal專案的過程中積累的一些好的開發方式,希望大家少走一些彎路。1.不...

敏捷開發方式,起步

前天看了一下 net 2.0極限程式設計專家指南 這本書,初衷是想學一些真實環境下,敏捷是如何與客戶互動的,從前看的書中,總覺得過程有一些不連貫。例如,如果跟客戶簽約,什麼時候收錢?如何按小時計費的?等等。如果遇到幾千塊的小專案,使用者是想在幾千元內就把問題搞定了。他想你把所有事情都包了,而你想跟他...