我正在做一個基於任務的程序,需要插件。任務需要具有易於編輯的屬性,我認爲這可以通過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編輯未知動態加載任務的屬性)????????????????????????????????
偉大的閱讀和一個示例框架解決方案啓動。基本上它說你只需要一個更智能的工廠系統來避免字符串鍵給你的樣板,我想我是在過度思考問題。如果我能整合它,這可能會解決我的困境。謝謝。 – 2010-04-26 02:18:53