From: Tobias Koenig Date: Sun, 14 Oct 2012 10:27:25 +0000 (+0200) Subject: Make signal handlers work as well X-Git-Url: http://git.silmor.de/gitweb/?a=commitdiff_plain;h=739465265849e6521b494274564a2737a1a1fbcb;p=konrad%2FDeclarativeWidgets.git Make signal handlers work as well --- diff --git a/declarativeobjects.cpp b/declarativeobjects.cpp index 9c3bef9..f4a8834 100644 --- a/declarativeobjects.cpp +++ b/declarativeobjects.cpp @@ -4,6 +4,25 @@ #include +/* + if (QString(staticMetaObject.className()) == "DeclarativeLabel") { \ + qDebug("class: %s propOffset: %d", qPrintable(staticMetaObject.className()), staticMetaObject.propertyOffset()); \ + for (int i = 0; i < staticMetaObject.propertyCount(); ++i) { \ + qDebug(" prop: %d=%s", i, staticMetaObject.property(i).name()); \ + } \ + qDebug("class: DeclarativeObject"); \ + for (int i = 0; i < DeclarativeObject::staticMetaObject.propertyCount(); ++i) { \ + qDebug(" prop: %d=%s", i, DeclarativeObject::staticMetaObject.property(i).name()); \ + } \ + } \ + if (QString(staticMetaObject.className()) == "DeclarativeLabel") { \ + qDebug("class: %s methodOffset: %d", qPrintable(staticMetaObject.className()), staticMetaObject.methodOffset()); \ + for (int i = 0; i < staticMetaObject.methodCount(); ++i) { \ + qDebug(" prop: %d=%s", i, staticMetaObject.method(i).signature()); \ + } \ + } \ +*/ + #define CUSTOM_METAOBJECT(ClassName, BaseType, WidgetType, WidgetVariable) \ QMetaObject ClassName::staticMetaObject;\ bool ClassName::metaObjectInitialized = ClassName::initializeMetaObject(); \ @@ -15,18 +34,7 @@ bool ClassName::initializeMetaObject() \ builder.addMetaObject(&DeclarativeObject::staticMetaObject); \ builder.setSuperClass(WidgetType::staticMetaObject.superClass()); \ builder.setClassName(""#ClassName); \ - QMetaObject *mo2 = builder.toMetaObject(); \ - ClassName::staticMetaObject = *mo2; \ - if (QString(staticMetaObject.className()) == "DeclarativeLabel") { \ - qDebug("class: %s propOffset: %d", qPrintable(staticMetaObject.className()), staticMetaObject.propertyOffset()); \ - for (int i = 0; i < staticMetaObject.propertyCount(); ++i) { \ - qDebug(" prop: %d=%s", i, staticMetaObject.property(i).name()); \ - } \ - qDebug("class: DeclarativeObject"); \ - for (int i = 0; i < DeclarativeObject::staticMetaObject.propertyCount(); ++i) { \ - qDebug(" prop: %d=%s", i, DeclarativeObject::staticMetaObject.property(i).name()); \ - } \ - } \ + ClassName::staticMetaObject = *builder.toMetaObject(); \ return true; \ } \ const QMetaObject &ClassName::getStaticMetaObject() \ @@ -43,25 +51,32 @@ void* ClassName::qt_metacast(const char *name) \ } \ int ClassName::qt_metacall(QMetaObject::Call call, int id, void **argv) \ { \ - qDebug("%s call=%d id=%d", staticMetaObject.className(), call, id); \ if (call == QMetaObject::ReadProperty || call == QMetaObject::WriteProperty) { \ if (id >= WidgetType::staticMetaObject.propertyCount()) { \ - qDebug() << "dobject" << this << id << (id - WidgetType::staticMetaObject.propertyCount() + 1); \ id = DeclarativeObject::qt_metacall(call, id - WidgetType::staticMetaObject.propertyCount() + 1, argv); \ - qDebug() << "after" << id; \ id += WidgetType::staticMetaObject.propertyCount() - 1; \ } else { \ - qDebug() << "widget" << WidgetVariable << id; \ - WidgetVariable->qt_metacall(call, id, argv); \ - qDebug() << "after" << id; \ - id -= 1; \ + id = WidgetVariable->qt_metacall(call, id, argv); \ } \ if (id < 0) \ return 0; \ + } else if (call == QMetaObject::InvokeMetaMethod) {\ + QMetaObject::activate(this, id, argv); \ } \ return id; \ } +static void connectAllSignals(QObject *sender, QObject *receiver) +{ + for (int i = 0; i < sender->metaObject()->methodCount(); ++i) { + const QMetaMethod method = sender->metaObject()->method(i); + if (method.methodType() == QMetaMethod::Signal) { + const QByteArray signature = "2" + QByteArray(method.signature()); + QObject::connect(sender, signature.data(), receiver, signature.data()); + } + } +} + // DeclarativeObject DeclarativeObject::DeclarativeObject(QObject *parent) : QObject(parent) @@ -100,7 +115,6 @@ void DeclarativeObject::dataClear() void DeclarativeObject::data_append(QDeclarativeListProperty *property, QObject *object) { - qDebug("tokoe: 1"); if (!object) return; @@ -110,21 +124,18 @@ void DeclarativeObject::data_append(QDeclarativeListProperty *property, int DeclarativeObject::data_count(QDeclarativeListProperty *property) { - qDebug("tokoe: 2"); DeclarativeObject *that = dynamic_cast(property->object); return that->dataCount(); } QObject* DeclarativeObject::data_at(QDeclarativeListProperty *property, int index) { - qDebug("tokoe: 3"); DeclarativeObject *that = dynamic_cast(property->object); return that->dataAt(index); } void DeclarativeObject::data_clear(QDeclarativeListProperty *property) { - qDebug("tokoe: 4"); DeclarativeObject *that = dynamic_cast(property->object); that->dataClear(); } @@ -134,6 +145,7 @@ DeclarativeVBoxLayout::DeclarativeVBoxLayout(QObject *parent) : DeclarativeObject(parent) , m_layout(new QVBoxLayout) { + connectAllSignals(m_layout, this); } DeclarativeVBoxLayout::~DeclarativeVBoxLayout() @@ -187,6 +199,7 @@ DeclarativeWidget::DeclarativeWidget(QObject *parent) : DeclarativeObject(parent) , m_widget(new QWidget) { + connectAllSignals(m_widget, this); } DeclarativeWidget::~DeclarativeWidget() @@ -241,8 +254,9 @@ CUSTOM_METAOBJECT(DeclarativeWidget, DeclarativeObject, QWidget, m_widget) // DeclarativeLabel DeclarativeLabel::DeclarativeLabel(QObject *parent) : DeclarativeWidget(parent) - , m_label(new QLabel("")) + , m_label(new QLabel) { + connectAllSignals(m_label, this); } DeclarativeLabel::~DeclarativeLabel() @@ -264,6 +278,7 @@ DeclarativeTabWidget::DeclarativeTabWidget(QObject *parent) : DeclarativeWidget(parent) , m_tabWidget(new QTabWidget) { + connectAllSignals(m_tabWidget, this); } QObject* DeclarativeTabWidget::object() @@ -310,6 +325,7 @@ DeclarativePushButton::DeclarativePushButton(QObject *parent) : DeclarativeWidget(parent) , m_pushButton(new QPushButton) { + connectAllSignals(m_pushButton, this); } QObject* DeclarativePushButton::object() diff --git a/test.qml b/test.qml index e2e99f7..89c732a 100644 --- a/test.qml +++ b/test.qml @@ -22,7 +22,7 @@ Widget { } PushButton { text: "Click me" - onClicked: lastLabel.text = "Changed" + onClicked: secondLabel.text = "Changed" } } }