From 6721324bd3220f0b8de3769825e6889aa2a09c0b Mon Sep 17 00:00:00 2001 From: Kevin Krammer Date: Tue, 16 Oct 2012 19:01:56 +0200 Subject: [PATCH] Add proxy class for QWidget Implements standard layout/child widget handling, allows sub classes to override selectively --- declarativeobjects.cpp | 71 ++++++++++------------------------------------ declarativeobjects_p.h | 72 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 78 insertions(+), 65 deletions(-) diff --git a/declarativeobjects.cpp b/declarativeobjects.cpp index d947080..834fb2d 100644 --- a/declarativeobjects.cpp +++ b/declarativeobjects.cpp @@ -3,7 +3,6 @@ #include "qmetaobjectbuilder_p.h" #include -#include /* if (QString(staticMetaObject.className()) == "DeclarativeLabel") { \ @@ -175,44 +174,15 @@ DeclarativeVBoxLayout::DeclarativeVBoxLayout(QObject *parent) : DeclarativeBoxLa CUSTOM_METAOBJECT(DeclarativeVBoxLayout, QVBoxLayout, m_proxiedObject) // DeclarativeWidget -DeclarativeWidget::DeclarativeWidget(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativeWidget::DeclarativeWidget(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); } -void DeclarativeWidget::dataAppend(QObject *object) -{ - AbstractDeclarativeObject *declarativeObject = dynamic_cast(object); - if (declarativeObject) { - QWidget *widget = qobject_cast(declarativeObject->object()); - if (widget) { - if (m_proxiedObject->layout()) { - qmlInfo(this) << "Can not add Widget since a Layout is set already"; - return; - } - - m_children.append(object); - widget->setParent(m_proxiedObject); - return; - } - - QLayout *layout = qobject_cast(declarativeObject->object()); - if (layout) { - // TODO: error when widget is set - - m_children.append(object); - m_proxiedObject->setLayout(layout); - return; - } - } - - DeclarativeObjectProxy::dataAppend(object); -} - CUSTOM_METAOBJECT(DeclarativeWidget, QWidget, m_proxiedObject) // DeclarativeLabel -DeclarativeLabel::DeclarativeLabel(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativeLabel::DeclarativeLabel(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); } @@ -220,38 +190,29 @@ DeclarativeLabel::DeclarativeLabel(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativeTabWidget::DeclarativeTabWidget(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); } -void DeclarativeTabWidget::dataAppend(QObject *object) +void DeclarativeTabWidget::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) { - AbstractDeclarativeObject *declarativeObject = dynamic_cast(object); - - if (declarativeObject) { - QWidget *widget = qobject_cast(declarativeObject->object()); - if (widget) { - // TODO: error when layout is set - m_children.append(object); - m_proxiedObject->addTab(widget, "MyTab"); - return; - } - - QLayout *layout = qobject_cast(declarativeObject->object()); - if (layout) { - qmlInfo(this) << "Can not add QLayout to QTabWidget"; - return; - } - } + // TODO: error when layout is set + m_children.append(declarativeObject); + m_proxiedObject->addTab(widget, "MyTab"); +} - DeclarativeObjectProxy::dataAppend(object); +void DeclarativeTabWidget::setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject) +{ + Q_UNUSED(layout); + Q_UNUSED(declarativeObject); + qmlInfo(this) << "Can not add QLayout to QTabWidget"; } CUSTOM_METAOBJECT(DeclarativeTabWidget, QTabWidget, m_proxiedObject) // DeclarativePushButton -DeclarativePushButton::DeclarativePushButton(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativePushButton::DeclarativePushButton(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); } @@ -259,7 +220,7 @@ DeclarativePushButton::DeclarativePushButton(QObject *parent) : DeclarativeObjec CUSTOM_METAOBJECT(DeclarativePushButton, QPushButton, m_proxiedObject) // DeclarativeCheckBox -DeclarativeCheckBox::DeclarativeCheckBox(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativeCheckBox::DeclarativeCheckBox(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); } @@ -267,7 +228,7 @@ DeclarativeCheckBox::DeclarativeCheckBox(QObject *parent) : DeclarativeObjectPro CUSTOM_METAOBJECT(DeclarativeCheckBox, QCheckBox, m_proxiedObject) // DeclarativeSlider -DeclarativeSlider::DeclarativeSlider(QObject *parent) : DeclarativeObjectProxy(parent) +DeclarativeSlider::DeclarativeSlider(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); } diff --git a/declarativeobjects_p.h b/declarativeobjects_p.h index 0defd47..5036476 100644 --- a/declarativeobjects_p.h +++ b/declarativeobjects_p.h @@ -11,6 +11,7 @@ #include #include #include +#include #define DECLARATIVE_OBJECT \ public: \ @@ -83,6 +84,59 @@ class DeclarativeObjectProxy : public AbstractDeclarativeObject }; template +class DeclarativeWidgetProxy : public DeclarativeObjectProxy +{ + public: + DeclarativeWidgetProxy(QObject *parent = 0) : DeclarativeObjectProxy(parent) {} + + protected: + virtual void dataAppend(QObject *object) + { + AbstractDeclarativeObject *declarativeObject = dynamic_cast(object); + if (declarativeObject) { + QWidget *widget = qobject_cast(declarativeObject->object()); + if (widget) { + if (DeclarativeObjectProxy::m_proxiedObject->layout()) { + qmlInfo(this) << "Can not add Widget since a Layout is set already"; + return; + } + + addWidget(widget, declarativeObject); + return; + } + + QLayout *layout = qobject_cast(declarativeObject->object()); + if (layout) { + // TODO: error when widget is set + + if (DeclarativeObjectProxy::m_proxiedObject->layout()) { + qmlInfo(this) << "Can not add a second Layout"; + return; + } + + setLayout(layout, declarativeObject); + return; + } + } + + DeclarativeObjectProxy::dataAppend(object); + } + + virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) + { + Q_UNUSED(declarativeObject); + DeclarativeObjectProxy::m_children.append(declarativeObject); + widget->setParent(DeclarativeObjectProxy::m_proxiedObject); + } + + virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject) + { + DeclarativeObjectProxy::m_children.append(declarativeObject); + DeclarativeObjectProxy::m_proxiedObject->setLayout(layout); + } +}; + +template class DeclarativeBoxLayout : public DeclarativeObjectProxy { public: @@ -128,18 +182,15 @@ class DeclarativeVBoxLayout : public DeclarativeBoxLayout DeclarativeVBoxLayout(QObject *parent = 0); }; -class DeclarativeWidget : public DeclarativeObjectProxy +class DeclarativeWidget : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT public: DeclarativeWidget(QObject *parent = 0); - - protected: - virtual void dataAppend(QObject *); }; -class DeclarativeLabel : public DeclarativeObjectProxy +class DeclarativeLabel : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT @@ -147,7 +198,7 @@ class DeclarativeLabel : public DeclarativeObjectProxy DeclarativeLabel(QObject *parent = 0); }; -class DeclarativeTabWidget : public DeclarativeObjectProxy +class DeclarativeTabWidget : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT @@ -155,7 +206,8 @@ class DeclarativeTabWidget : public DeclarativeObjectProxy DeclarativeTabWidget(QObject *parent = 0); protected: - virtual void dataAppend(QObject *); + virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject); + virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject); }; /* class DeclarativeTab : public DeclarativeWidget @@ -177,7 +229,7 @@ class DeclarativeTab : public DeclarativeWidget QObject* m_child; }; */ -class DeclarativePushButton : public DeclarativeObjectProxy +class DeclarativePushButton : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT @@ -185,7 +237,7 @@ class DeclarativePushButton : public DeclarativeObjectProxy DeclarativePushButton(QObject *parent = 0); }; -class DeclarativeCheckBox : public DeclarativeObjectProxy +class DeclarativeCheckBox : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT @@ -193,7 +245,7 @@ class DeclarativeCheckBox : public DeclarativeObjectProxy DeclarativeCheckBox(QObject *parent = 0); }; -class DeclarativeSlider : public DeclarativeObjectProxy +class DeclarativeSlider : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT -- 1.7.2.5