#ifndef AUTOFORM_H #define AUTOFORM_H #include #include #include #include #include #include #include "service.h" template class AutoForm : public QWidget { public: explicit AutoForm(QWidget *parent = 0) : QWidget(parent) { m_newRec = false; } virtual ~AutoForm() {} void setEntity(QSharedPointer entity) { m_entity = entity; bindToUi(); } void registerBinding(QWidget *widget) { if (!m_bindWidgets.contains(widget)) { m_bindWidgets.append(widget); } } private: QSharedPointer m_entity; QList m_bindWidgets; bool m_newRec; void bindToUi() { foreach (QWidget *widget, m_bindWidgets) { const char* prop = widget->metaObject()->userProperty().name(); widget->setProperty(prop, ((QObject*)m_entity.data())->property(widget->objectName().toStdString().c_str())); } } void bindToData() { foreach (QWidget *widget, m_bindWidgets) { const char* prop = widget->metaObject()->userProperty().name(); ((QObject*)m_entity.data())->setProperty(widget->objectName().toStdString().c_str(), widget->property(prop)); } } signals: void recordAdded(QSharedPointer entity); void recordUpdated(QSharedPointer entity); public slots: void saveRecord() { bindToData(); Service service; service.save(m_entity); if (m_newRec) { emit recordAdded(m_entity); } else { emit recordUpdated(m_entity); } } }; #endif // AUTOFORM_H