огромное спасибо
ваша идея работает (с небольшими изменениями):#include <QApplication>
#include <QString>
#include <QVariant>
#include <QWidget>
#include <QLineEdit>
#include <QDateEdit>
#include <QHBoxLayout>
class Implementor
{
public:
Implementor(){};
virtual ~Implementor(){};
virtual void setData(QVariant){};
};
class LineEdit: public QLineEdit, public Implementor
{
public:
LineEdit(QWidget *parent = 0): QLineEdit(parent){};
void setData(const QVariant data){setText(data.toString());};
};
class DateEdit: public QDateEdit, public Implementor
{
public:
DateEdit(QWidget *parent = 0): QDateEdit(parent){};
void setData(const QVariant data){setDate(data.toDate());};
};
class EditWidget: public QWidget
{
protected:
QHBoxLayout *layout;
Implementor *implementor;
public:
EditWidget(QString type):QWidget(){
layout = new QHBoxLayout;
if(type == "lineedit"){
implementor = new LineEdit(this);
if(implementor) layout->addWidget((LineEdit*)implementor);
}
if(type == "dateedit"){
implementor = new DateEdit(this);
if(implementor) layout->addWidget((DateEdit*)implementor);
}
setLayout(layout);
};
~EditWidget(){
if(implementor) delete implementor;
if(layout) delete layout;
};
virtual void setData(QVariant data)
{
implementor->setData(data);
};
};
class Frame: public QFrame{
private:
QHBoxLayout *layout;
EditWidget *edit;
public:
Frame(const QString& atype){
layout = new QHBoxLayout;
edit = new EditWidget(atype);
layout->addWidget(edit);
setLayout(layout);
setFrameShape(QFrame::Box);
setFrameShadow(QFrame::Plain);
}
~Frame(){
if(edit) delete edit;
if(layout) delete layout;
}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Frame f("lineedit");
f.show();
return app.exec();
}