// дано:
// Qt 4.3.3
// Class EditWidget: public QFrame{
// ...
// public:
// ...
// QVariant getData() const;
// void setData(QVariant);
// void clear();
// };
//
// не могу :) (требуется):
//
// реализовать widget с единым интерфейсом доступа к редактируемым данным.
// например такой код - EditWidget *p = new EditWidget("string");
// должен создать объект QFrame с QLineEdit в нем,
// EditWidget *p = new EditWidget("date"); - QFrame и QDateEdit в нем
//
// попробовал так:#include <QApplication>
#include <QString>
#include <QVariant>
#include <QWidget>
#include <QLineEdit>
#include <QHBoxLayout>
class AbstractEdit: virtual public QWidget{
public:
virtual QVariant getData() const = 0;
virtual void setData(const QVariant& adata) = 0;
virtual void clear() = 0;
};
class LineEdit: virtual public AbstractEdit, virtual public QLineEdit{
public:
LineEdit(QWidget* aparent=0): QLineEdit(aparent){}
LineEdit(const QVariant& adata, QWidget* aparent=0): QLineEdit(adata.toString(), aparent){}
QVariant getData() const { return QVariant(text()); }
void setData(const QVariant& adata){ setText(adata.toString()); }
void clear(){ clear(); }
};
class Frame: public QFrame{
AbstractEdit *edit;
QHBoxLayout layout;
Frame(){}
public:
Frame(const QString& type): edit(0){
if(type == "lineedit") edit = new LineEdit("hello");
if(edit){
layout.addWidget(edit);
setLayout(&layout);
}
setFrameShape(QFrame::Box);
setFrameShadow(QFrame::Plain);
}
~Frame(){if(edit) delete edit;}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Frame f("lineedit");
f.show();
return app.exec();
}
// но во фрейме не отображается QLineEdit, видимо QVBoxLayout вызывает метод QWidget::show();
// если пытаться сделать виртуальным слот show() возникает проблема (moc+множ.наследование)
// вобщем ничего не получается:)
// буду рад любым предложениям