如何根据文件类型专门化小部件?

时间:2010-08-02 08:52:45

标签: c++ qt

我正在寻找一种在运行时专门化小部件的方法。我有一个用Qt Designer创建的表单。在这种形式中,有一个小部件显示用户数据,如姓名,年龄等。然后用户选择一个文件,根据类型,小部件应显示附加信息(如OO示例人 - >学生,教师)。

我尝试在表单上放置一个空QWidget,为其分配一个人窗口小部件,如果用户点击一个按钮,我就打电话给deleteLater()人,并指定new Student()。这可行,但新小部件不遵循布局。

我还找到了QStackedWidget。这似乎有效,但因为所有可能的小部件都是在显示表单时创建的,即使它们从未被使用过,这种方式感觉不对。

实现这个目标的方法是什么?

编辑:我觉得我的问题有点不清楚。如果想要用原始小部件的专用(继承)版本替换QWidget,应该使用什么Qt机制?我正在寻找Qt的方法来做到这一点。

4 个答案:

答案 0 :(得分:1)

您需要动态添加小部件到您在设计器中绘制的小部件。

// in UI file
QWidget *wdgFromForm;

// in cpp file 
QHBoxLayout *const layout(new QHBoxLayout(wdgFromForm)); 
SpecializedWidget * specializedWidget( new SpecializedWidget(wdgFromForm));
layout->addWidget(specializedWidget);

答案 1 :(得分:0)

也许问题不在于窗口小部件不合适,而在于您没有给窗口小部件更新时间。

您可以查看processEvents: http://web.mit.edu/qt-dynamic/www/qapplication.html#details

答案 2 :(得分:0)

这看起来像factory pattern的用例。

#include <map>
#include <string>
struct Whatever;
struct QWidget;
typedef QWidget*(*WidgetCtor)(Whatever*);
typedef std::map<std::string, WidgetCtor> FileFactory;

QWidget* createFoo(Whatever*);
QWidget* createBar(Whatever*);
QWidget* createDefault(Whatever*);

void factory_init(FileFactory& ff)
{
    ff["foo"] = createFoo;
    ff["bar"] = createBar;
}

QWidget* create_by_factory(const FileFactory& ff, const std::string t, Whatever* w)
{
    FileFactory::const_iterator it(ff.find(t));
    if(it != ff.end())
    {
        return it->second(w);
    }
    else
    {
        return createDefault(w);
    }
}

答案 3 :(得分:0)

动态添加小部件到布局不是问题。 您可能需要在包含的小部件上调用updateGeometry。