Как специализировать виджет в соответствии с типом файла? - PullRequest
1 голос
/ 02 августа 2010

Я ищу способ специализировать виджет во время выполнения.У меня есть форма, созданная с помощью Qt Designer.В этой форме есть виджет, который отображает данные пользователя, такие как имя, возраст и так далее.Затем пользователь выбирает файл, и в соответствии с типом виджет должен отображать дополнительную информацию (как, например, в OO, например, человек -> студент, учитель).

Я попытался поместить пустой QWidget в мою форму, назначил человекавиджет к нему, и если пользователь нажимает кнопку, я вызываю deleteLater() на человека и назначаю new Student().Это работает, но новый виджет тогда не следует макету.

Я также нашел QStackedWidget.Кажется, это работает, но поскольку все возможные виджеты создаются при показе формы, даже если они никогда не используются, этот способ не выглядит правильным.

Каким образом это можно сделать?

Редактировать: Я чувствую, что мой вопрос немного неясен.Какой механизм Qt следует использовать, если кто-то хочет заменить QWidget специализированной (унаследованной) версией исходного виджета?Я ищу Qt способ сделать это.

Ответы [ 4 ]

1 голос
/ 03 августа 2010

Вам необходимо динамически добавить виджет в виджет, который вы нарисовали в конструкторе.

// in UI file
QWidget *wdgFromForm;

// in cpp file 
QHBoxLayout *const layout(new QHBoxLayout(wdgFromForm)); 
SpecializedWidget * specializedWidget( new SpecializedWidget(wdgFromForm));
layout->addWidget(specializedWidget);
0 голосов
/ 02 августа 2010

Это похоже на случай использования фабричного шаблона .

#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);
    }
}
0 голосов
/ 02 августа 2010

Добавление виджетов динамически в макет не является проблемой. Возможно, вам потребуется вызвать updateGeometry для содержащего виджета.

0 голосов
/ 02 августа 2010

Возможно, проблема не в том, что виджет не подходит, а просто в том, что вы не даете времени для обновления виджета.

Вы можете взглянуть на processEvents: http://web.mit.edu/qt-dynamic/www/qapplication.html#details

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...