代码之家  ›  专栏  ›  技术社区  ›  DaClown

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

  •  1
  • DaClown  · 技术社区  · 16 年前

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

    我试着在我的表单上放置一个空的Qwidget,给它分配一个Person widget,如果用户单击我调用的按钮 deleteLater() 亲自并指派 new Student() . 这是可行的,但新的小部件不遵循布局。

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

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

    编辑: 我觉得我的问题有点不清楚。如果要用原始小部件的专用(继承)版本替换Qwidget,应该使用什么qt机制?我在找qt的方法。

    4 回复  |  直到 16 年前
        1
  •  1
  •   TimW    16 年前

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

    // in UI file
    QWidget *wdgFromForm;
    
    // in cpp file 
    QHBoxLayout *const layout(new QHBoxLayout(wdgFromForm)); 
    SpecializedWidget * specializedWidget( new SpecializedWidget(wdgFromForm));
    layout->addWidget(specializedWidget);
    
        2
  •  0
  •   Baltasarq    16 年前

    也许问题不在于这个小部件不合适,而在于你没有给它更新的时间。

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

        3
  •  0
  •   Rudi    16 年前

    这看起来像是 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);
        }
    }
    
        4
  •  0
  •   Frank Osterfeld    16 年前

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