Код: Выделить всё
class CheckBox: public QCheckBox, public Control
{
Q_OBJECT
public:
CheckBox(QWidget* parent = 0);
CheckBox(DataSource* data, QWidget* parent = 0);
virtual ~CheckBox();
virtual void Foobar();
};
class ComboBox: public QComboBox, public Control
{
Q_OBJECT
public:
ComboBox(QWidget* parent = 0);
ComboBox(DataSource* data, QWidget* parent = 0);
virtual ~ComboBox();
virtual void Foobar();
};
Код: Выделить всё
class CheckBoxDataSource: public DataSource
{
public:
CheckBoxDataSource();
virtual ~CheckBoxDataSource();
virtual QWidget* createControl(QWidget* parent);
};
class ComboBoxDataSource: public DataSource
{
public:
ComboBoxDataSource();
virtual ~ComboBoxDataSource();
virtual QWidget* createControl(QWidget* parent);
};
Код: Выделить всё
for data in dataSources:
widget = data.createControl(parent) # returns a QCheckBox/QComboBox/etc
# at a later time ...
widget.Foobar()
Я пробовал приведенные ниже варианты, но ни один из них не работает...
Попытка 1
В Python я попытался привести виджет к нужному классу C++, чтобы можно было вызвать Foobar().
Код: Выделить всё
widget.__class__ = CheckBox
widget.__class__ = ComboBox
Попытка 2
Если я добавлю виртуальный void Foobar()< /code> в базовый класс Control и объявите createControl(), чтобы он возвращал Control* вместо QWidget*. Это должно позволить клиентам вызывать Foobar() в Python, но они также теряют возможность обрабатывать его как QWidget.
Попытка 3
Код: Выделить всё
widget = CheckBox(data.createControl(parent))
Извините, в моем мозгу сейчас полный беспорядок, я думаю, что должен быть лучший дизайн фабрики?
Подробнее здесь: https://stackoverflow.com/questions/788 ... tory-in-qt