From b234ae0a69fba94ce2160dc8f808f916d32da4ae Mon Sep 17 00:00:00 2001 From: Kevin Krammer Date: Tue, 16 Oct 2012 19:54:58 +0200 Subject: [PATCH] Attached property for TabWidget to specify tab label/icon --- declarativeobjects.cpp | 60 ++++++++++++++++++++++++++++++++++++++++- declarativeobjects_p.h | 34 +++++++++++++++++++++++ declarativewidgetdocument.cpp | 1 + test.qml | 4 +++ 4 files changed, 98 insertions(+), 1 deletions(-) diff --git a/declarativeobjects.cpp b/declarativeobjects.cpp index 834fb2d..aefa4b1 100644 --- a/declarativeobjects.cpp +++ b/declarativeobjects.cpp @@ -190,6 +190,48 @@ DeclarativeLabel::DeclarativeLabel(QObject *parent) : DeclarativeWidgetProxylabel) + return; + + d->label = label; + emit labelChanged(label); +} + +QString TabWidgetTabHeader::label() const +{ + return d->label; +} + +void TabWidgetTabHeader::setIcon(const QIcon &icon) +{ + d->icon = icon; + emit iconChanged(icon); +} + +QIcon TabWidgetTabHeader::icon() const +{ + return d->icon; +} + DeclarativeTabWidget::DeclarativeTabWidget(QObject *parent) : DeclarativeWidgetProxy(parent) { connectAllSignals(m_proxiedObject, this); @@ -198,8 +240,19 @@ DeclarativeTabWidget::DeclarativeTabWidget(QObject *parent) : DeclarativeWidgetP void DeclarativeTabWidget::addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject) { // TODO: error when layout is set + m_children.append(declarativeObject); - m_proxiedObject->addTab(widget, "MyTab"); + + QString label; + QIcon icon; + + TabWidgetTabHeader *tabHeader = declarativeObject->findChild(); + if (tabHeader) { + label = tabHeader->label(); + icon = tabHeader->icon(); + } + + m_proxiedObject->addTab(widget, icon, label); } void DeclarativeTabWidget::setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject) @@ -209,6 +262,11 @@ void DeclarativeTabWidget::setLayout(QLayout *layout, AbstractDeclarativeObject qmlInfo(this) << "Can not add QLayout to QTabWidget"; } +TabWidgetTabHeader *DeclarativeTabWidget::qmlAttachedProperties(QObject *object) +{ + return new TabWidgetTabHeader(object); +} + CUSTOM_METAOBJECT(DeclarativeTabWidget, QTabWidget, m_proxiedObject) // DeclarativePushButton diff --git a/declarativeobjects_p.h b/declarativeobjects_p.h index 5036476..e8144b7 100644 --- a/declarativeobjects_p.h +++ b/declarativeobjects_p.h @@ -12,6 +12,7 @@ #include #include #include +#include #define DECLARATIVE_OBJECT \ public: \ @@ -198,6 +199,34 @@ class DeclarativeLabel : public DeclarativeWidgetProxy DeclarativeLabel(QObject *parent = 0); }; + +// attached property for DeclarativeTabWidget +class TabWidgetTabHeader : public QObject +{ + Q_OBJECT + + Q_PROPERTY(QString label READ label WRITE setLabel NOTIFY labelChanged) + Q_PROPERTY(QIcon icon READ icon WRITE setIcon NOTIFY iconChanged) + + public: + TabWidgetTabHeader(QObject *parent = 0); + ~TabWidgetTabHeader(); + + void setLabel(const QString &label); + QString label() const; + + void setIcon(const QIcon &icon); + QIcon icon() const; + + Q_SIGNALS: + void labelChanged(const QString &label); + void iconChanged(const QIcon &icon); + + private: + class Private; + Private *const d; +}; + class DeclarativeTabWidget : public DeclarativeWidgetProxy { DECLARATIVE_OBJECT @@ -205,10 +234,15 @@ class DeclarativeTabWidget : public DeclarativeWidgetProxy public: DeclarativeTabWidget(QObject *parent = 0); + static TabWidgetTabHeader *qmlAttachedProperties(QObject *object); + protected: virtual void addWidget(QWidget *widget, AbstractDeclarativeObject *declarativeObject); virtual void setLayout(QLayout *layout, AbstractDeclarativeObject *declarativeObject); }; + +QML_DECLARE_TYPEINFO(DeclarativeTabWidget, QML_HAS_ATTACHED_PROPERTIES) + /* class DeclarativeTab : public DeclarativeWidget { diff --git a/declarativewidgetdocument.cpp b/declarativewidgetdocument.cpp index 0b7e218..1377bf8 100644 --- a/declarativewidgetdocument.cpp +++ b/declarativewidgetdocument.cpp @@ -33,6 +33,7 @@ DeclarativeWidgetDocument::DeclarativeWidgetDocument(const QUrl &url, QObject *p qmlRegisterType("QtGui", 1, 0, "Label"); qmlRegisterType("QtGui", 1, 0, "HBoxLayout"); qmlRegisterType("QtGui", 1, 0, "VBoxLayout"); + qmlRegisterType(); qmlRegisterType("QtGui", 1, 0, "TabWidget"); qmlRegisterType("QtGui", 1, 0, "PushButton"); qmlRegisterType("QtGui", 1, 0, "CheckBox"); diff --git a/test.qml b/test.qml index 96c080b..a3d1191 100644 --- a/test.qml +++ b/test.qml @@ -49,12 +49,16 @@ Widget { } TabWidget { Label { + TabWidget.label: "Title 1" + text: "Page 1" } Label { text: "Page 2" } Label { + TabWidget.label: "Title 3" + text: "Page 3" } } -- 1.7.2.5