我正在寻找一种在运行时专门化小部件的方法。我有一个用Qt Designer创建的表单。在这种形式中,有一个小部件显示用户数据,如姓名,年龄等。然后用户选择一个文件,根据类型,小部件应显示附加信息(如OO示例人 - >学生,教师)。
我尝试在表单上放置一个空QWidget,为其分配一个人窗口小部件,如果用户点击一个按钮,我就打电话给deleteLater()
人,并指定new Student()
。这可行,但新小部件不遵循布局。
我还找到了QStackedWidget。这似乎有效,但因为所有可能的小部件都是在显示表单时创建的,即使它们从未被使用过,这种方式感觉不对。
实现这个目标的方法是什么?
编辑:我觉得我的问题有点不清楚。如果想要用原始小部件的专用(继承)版本替换QWidget,应该使用什么Qt机制?我正在寻找Qt的方法来做到这一点。
答案 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。