首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时通过插件机制动态加载数据类型

如何在运行时通过插件机制动态加载数据类型
EN

Stack Overflow用户
提问于 2012-02-09 14:00:27
回答 1查看 281关注 0票数 2

由于Qt不允许在插槽中使用模板,因此我尝试了以下解决方案,但没有成功。

首先,a想创建一个这样的列表:

代码语言:javascript
复制
list commands = 
0, "MyDashboard", DashBoard0
1, "MomsDashboard", Dashboard1

仪表板0和1都派生自小部件

假设您有一个QListWidget,我们在其中添加列表中的字符串,然后进行连接:

代码语言:javascript
复制
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#类型中那样创建列表和存储类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-09 14:08:35

C++不允许您创建类型仅在运行时已知的对象(使用new运算符)。但是,您可以使用Factory Method模式的简化形式作为变通方法。

下面是一个例子:

代码语言:javascript
复制
// 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语句。这种替代方法将是Prototype Pattern的一个示例。下面是一些示例代码,演示了这种方法:

代码语言:javascript
复制
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#中的任何反射功能。这就是为什么你必须求助于像Factory Method和Abstract Factory这样的模式。

附录

我还没有意识到Qt可能会提供运行时类信息,而不是C++中通常可用的信息(我只将Qt用于简单的实用应用程序,所以我不知道该框架中所有可用的花哨功能)。考虑到这一点,我搜索并找到了关于如何通过类名实例化Qt对象的邮件列表discussion。不过,我不知道这种解决方案是否适用于插件对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9206111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档