2010-04-25 40 views
5

我正在做一個基於任務的程序,需要插件。任務需要具有易於編輯的屬性,我認爲這可以通過Qt的元對象編譯器反射功能來完成(我可能是錯誤的,但是我應該可以將它粘貼到QtPropertyBrowser中?)試圖製作一個插件系統在C++/Qt

因此,這裏是基:

class Task : public QObject 
{ 
Q_OBJECT 
public: 
    explicit Task(QObject *parent = 0) : QObject(parent){} 

    virtual void run() = 0; 

signals: 
    void taskFinished(bool success = true); 
} 

然後一個插件可能有這樣的任務:

class PrinterTask : public Task 
{ 
Q_OBJECT 
public: 
    explicit PrinterTask(QObject *parent = 0) : Task(parent) {} 

    void run() 
    { 
     Printer::getInstance()->Print(this->getData()); // fictional 
     emit taskFinished(true); 
    } 

    inline const QString &getData() const; 
    inline void setData(QString data); 

Q_PROPERTY(QString data READ getData WRITE setData) // for reflection 
} 

概括地說,這裏就是我想要做的:

// load plugin 
// find all the Tasks interface implementations in it 
// have user able to choose a Task and edit its specific Q_PROPERTY's 
// run the TASK 

一個.dll有多個任務是很重要的,因爲我希望他們通過他們的模塊進行關聯。例如,「FileTasks.dll」可能具有刪除文件,製作文件等任務。

Qt插件設置的唯一問題是我想將一定量的任務存儲在一個.dll模塊中。據我所知,每個插件只能加載一個接口(我可能是錯的?)。如果是這樣,完成我所需要的唯一可能的方法是創建一個帶有基於字符串的鍵的FactoryInterface,它返回對象(如Qt的即插即用示例),這是我想避免的一個可怕的樣板。

任何人都知道比Qt做得更乾淨的C++插件架構來做我想做的事情嗎?另外,我是否安全地假設Qt的反射能力會做我想做的事情(即能夠在調度之前用QtPropertyBrowser編輯未知動態加載任務的屬性)????????????????????????????????

回答

6

聽起來像你一直在給這個徹底的想法,這是偉大的和需要的。我不能對Qt的細節發表評論,但一定不要錯過這些作品插件的建議,特別是版本Plugin Architecture

+0

偉大的閱讀和一個示例框架解決方案啓動。基本上它說你只需要一個更智能的工廠系統來避免字符串鍵給你的樣板,我想我是在過度思考問題。如果我能整合它,這可能會解決我的困境。謝謝。 – 2010-04-26 02:18:53

4

你避免任何原因,Qt的內置plugin framework

示例here

編輯:對不起,我錯過了

據我所知,你只能加載插件每一個接口

之前。 plug-and-paint示例顯示您可以在一個插件中實現多個接口。我對你正在討論的基於字符串的工廠感到困惑,這個例子在加載插件後使用QObject,插槽和信號。字符串僅用於在幫助菜單中顯示插件的名稱。

+0

我的意思是一種輕鬆加載許多繼承一個插件接口的類的方法。也許我很困惑,但它看起來像只能加載每種接口類型之一?必須使用我認爲的解決方法。 – 2010-04-26 20:09:35

+0

也許我很困惑,你想從一個DLL加載多個插件?首先,爲什麼不是少文件?其次,我相信如果是這樣的話,那麼是的,你是對的。每個DLL只有一個插件,但每個插件可以實現多個接口。如果你想要一個單一的DLL的唯一原因是爲了少文件,我會強烈建議不然。更小的編譯單元可加快重新編譯時間並更輕鬆地進行測試。 – 2010-04-26 20:40:46

+0

每個插件一個DLL使開發人員和用戶更簡單。完全同意亞當。 – 2017-10-03 11:59:29