URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7343
[ Назад ]

Исходное сообщение
"Qt: множественное наследование."

Отправлено sherzod , 29-Апр-08 17:18 
//    дано:
//        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+множ.наследование)
// вобщем ничего не получается:)
// буду рад любым предложениям


Содержание

Сообщения в этом обсуждении
"Qt: множественное наследование."
Отправлено primus , 01-Май-08 16:08 
>//  реализовать 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();
}


"Qt: множественное наследование."
Отправлено sherzod , 01-Май-08 16:54 
ну хоть кто-то отозвался:) спасибо
вообще рабочая версия такая и есть...
но хотелось бы легкости в сопровождении
при появлении новых виджетов
приходится дополнять все функции (getData(), setData(), clear(), isMoified() и т.д.) дополнительными проверками
было бы замечательно если такая проверка осуществлялась только при создании editora...

"Qt: множественное наследование."
Отправлено primus , 02-Май-08 07:31 
>ну хоть кто-то отозвался:) спасибо
>вообще рабочая версия такая и есть...
>но хотелось бы легкости в сопровождении
>при появлении новых виджетов
>приходится дополнять все функции (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();
}


"Qt: множественное наследование."
Отправлено sherzod , 02-Май-08 13:56 
огромное спасибо
ваша идея работает (с небольшими изменениями):

#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();
}


"Qt: множественное наследование."
Отправлено qtprog , 03-Май-08 11:41 
>  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);
>   }

вместо этой кривизны тогда уж лучше шаблон заюзать


"Qt: множественное наследование."
Отправлено sherzod , 06-Май-08 10:26 

>вместо этой кривизны тогда уж лучше шаблон заюзать

например?
как можно обойти в таком случае moc (который не поддерживает шаблоны)?