// дано:
// 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+множ.наследование)
// вобщем ничего не получается:)
// буду рад любым предложениям
>// реализовать 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 <QDateEdit>
#include <QHBoxLayout>class EditWidget: virtual public QWidget{
private:
QWidget *editor;
QString mytype;
public:
EditWidget(){};
EditWidget(const QString& type){
mytype = type;
setLayout(new QVBoxLayout);
if(type == "lineedit")
editor = new QLineEdit();
else if (type == "dateedit")
editor = new QDateEdit();
layout()->addWidget(editor);
}
;
~EditWidget(){if(editor) delete editor;};
virtual QVariant getData(){return 0;};
virtual void setData(const QVariant& adata);
virtual void clear(){};};
void
EditWidget::setData(const QVariant& data)
{
if(mytype == "lineedit")
{
((QLineEdit*)editor)->setText(data.toString());
}
if(mytype == "dateedit")
{
((QDateEdit*)editor)->setDate(data.toDate());
}
}
class Frame: public QFrame{
EditWidget *ledit;
EditWidget *dedit;
QHBoxLayout layout;
public:
Frame(){
ledit = new EditWidget("lineedit");
dedit = new EditWidget("dateedit");
if(ledit){
ledit->setData("Hello from Africa");
layout.addWidget(ledit);
}
if(dedit){
dedit->setData("2008-05-01");
layout.addWidget(dedit);
}
setLayout(&layout);
setFrameShape(QFrame::Box);
setFrameShadow(QFrame::Plain);}
~Frame(){if(ledit) delete ledit; if(dedit) delete dedit;}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Frame f;
f.show();
return app.exec();
}
ну хоть кто-то отозвался:) спасибо
вообще рабочая версия такая и есть...
но хотелось бы легкости в сопровождении
при появлении новых виджетов
приходится дополнять все функции (getData(), setData(), clear(), isMoified() и т.д.) дополнительными проверками
было бы замечательно если такая проверка осуществлялась только при создании editora...
>ну хоть кто-то отозвался:) спасибо
>вообще рабочая версия такая и есть...
>но хотелось бы легкости в сопровождении
>при появлении новых виджетов
>приходится дополнять все функции (getData(), setData(), clear(), isMoified() и т.д.) дополнительными проверками
>
>было бы замечательно если такая проверка осуществлялась только при создании editora...или вот так
#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 Implementor, public QLineEdit
{
public:
LineEdit(QWidget *parent = 0): QLineEdit(parent){};
void setData(const QVariant data){setText(data.toString());};
};class DateEdit : public Implementor, public QDateEdit
{
public:
DateEdit(QWidget *parent = 0): QDateEdit(parent){};
void setData(const QVariant data){setDate(data.toDate());};
};class EditWidget: public QWidget
{
protected:
Implementor *implementor;
public:
EditWidget(QString type):QWidget(){
if(type == "lineedit")
implementor = new LineEdit(this);
else if(type == "dateedit")
implementor = new DateEdit(this);
};
~EditWidget(){if(implementor) delete implementor;};virtual void setData(QVariant data)
{
implementor->setData(data);
};
};class Frame: public QFrame{
QVBoxLayout layout;
EditWidget *ledit, *dedit;
public:
Frame(){
ledit = new EditWidget("lineedit");
ledit->setData("Hello from Africa");
layout.addWidget((QWidget*)ledit);dedit = new EditWidget("dateedit");
dedit->setData("2008-05-01");
layout.addWidget((QWidget*)dedit);setLayout(&layout);
setFrameShape(QFrame::Box);
setFrameShadow(QFrame::Plain);}
~Frame(){if(ledit) delete ledit; if(dedit) delete dedit;}
};
int main(int argc, char** argv)
{
QApplication app(argc, argv);
Frame f;
f.show();
return app.exec();
}
огромное спасибо
ваша идея работает (с небольшими изменениями):#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();
}
> 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);
> }вместо этой кривизны тогда уж лучше шаблон заюзать
>вместо этой кривизны тогда уж лучше шаблон заюзатьнапример?
как можно обойти в таком случае moc (который не поддерживает шаблоны)?