如何在运行时通过插件机制动态加载数据类型
How to dynamically load datatypes during runtime through a plugin mechanism
由于Qt不允许在其插槽中使用模板,我尝试了以下解决方案,但没有成功。
首先,a想创建一个这样的列表:
list commands =
0, "MyDashboard", DashBoard0
1, "MomsDashboard", Dashboard1
仪表板0和1都源自小部件
假设您有一个QListWidget
,我们在其中添加列表中的字符串,然后进行连接:
connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)),
this, SLOT(addDashboard(QListWidgetItem*)));
void addDashboard(QListWidgetItem* item) {
int index = listWidget->row(item);
QWidget* widget = new typeof(command.atIndex(index).getType());
widget->show();
}
我该如何创建该列表和存储类型,就像您在C#Type中所做的那样?
C++不允许您创建一个对象(使用新运算符),其中类型仅在运行时已知。但是,可以使用简化形式的Factory方法模式作为解决方法。
这里有一个例子:
// Type IDs that are associated with a widget type
enum WidgetTypeId {
dashboard1WidgetTypeId,
dashboard2WidgetTypeId
};
// Factory method
QWidget* createWidget(WidgetTypeId type) {
switch (type)
{
case dashboard1WidgetTypeId:
return new DashBoard0;
case dashboard2WidgetTypeId:
return new DashBoard1;
}
}
void addDashboard(QListWidgetItem* item) {
int index = listWidget->row(item);
QWidget* widget = createWidget(command.atIndex(index).getWidgetTypeId());
widget->show();
}
我知道不是很漂亮。如果您的小部件是可克隆的,那么您可以使用std::map
而不是丑陋的switch语句。这种替代方法将是原型模式的一个例子。下面是一些展示这种方法的示例代码:
class WidgetFactory
{
public:
QWidget* create(const std::string& name) {
return prototypes_[name]->clone();
}
void addPrototype(const std::string& name, QWidget* prototype) {
prototypes_[name] = prototype;
}
private:
std::map<std::string, QWidget*> prototypes_;
}
WidgetFactory factory;
factory.addPrototype("DashBoard0", new DashBoard0);
factory.addPrototype("DashBoard1", new DashBoard1);
void addDashboard(QListWidgetItem* item) {
int index = listWidget->row(item);
QWidget* widget = factory.create(command.atIndex(index).getWidgetTypeName());
widget->show();
}
C++不是一种动态性很强的语言。它具有有限的RTTI功能,实际上没有C#中的反射特性。这就是为什么你必须求助于像工厂方法和抽象工厂这样的模式。
附录
我还没有意识到Qt可能提供的运行时类信息超出了C++中通常可用的信息(我只将Qt用于简单的实用程序应用程序,所以我不知道该框架中所有可用的功能)。考虑到这一点,我搜索并找到了关于如何通过类名实例化Qt对象的邮件列表讨论。不过,我不知道这个解决方案是否适用于插件对象。
相关文章:
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 控制允许动态运行c++的并发操作数
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 输出没有重复元素的动态数组(收缩数组)C++
- C++为线程工作动态地分割例程
- 正在插入动态数组
- 在c++中使用动态分配的问题
- C++中的动态对象与非动态对象
- 如何在动态数组上使用搜索函数
- 视觉studo 2019中的漫画和静态/动态绑定
- 从C++中的数字输入动态创建矩阵
- 如何从QToolBox中动态创建的QLineEdit中获取文本
- 对C++中的异常机制执行动态绑定规则
- 如何在运行时通过插件机制动态加载数据类型