【发布时间】:2010-04-25 22:27:41
【问题描述】:
我正在制作一个需要插件的基于任务的程序。任务需要具有易于编辑的属性,我认为这可以通过 Qt 的 Meta-Object Compiler 反射功能来完成(我可能是错的,但我应该能够将其粘贴在 QtPropertyBrowser 中?)
所以这是基础:
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 插件设置的唯一问题是我想将 X 数量的任务存储在一个 .dll 模块中。据我所知,每个插件只能加载一个接口(我可能错了吗?)。如果是这样,完成我想要的唯一可能的方法是使用返回对象的基于字符串的键创建 FactoryInterface(如 Qt 的 Plug-And-Paint 示例中),这是我想避免的可怕样板。
有人知道比 Qt 更简洁的 C++ 插件架构来做我想做的事吗?
另外,我是否可以安全地假设 Qt 的反射功能会做我想做的事情(即能够在调度之前使用 QtPropertyBrowser 编辑未知的动态加载任务的属性)?
【问题讨论】: