Похоже, Система свойств Qt - идеальное решение для вас:
class TableData : public QObject {
Q_OBJECT
public:
TableData() : QObject(), _id(0) {}
QVariant getFieldValue(const char * fieldName) const {
return property(fieldName);
}
void setFieldValue(const char * fieldName, QVariant _value) {
setProperty(fieldName, _value);
}
int id() const { return _id; }
void setId(int newID) {
_id = newID;
emit idChanged();
}
protected:
Q_PROPERTY(int id
READ id
WRITE setId
NOTIFY idChanged)
int _id;
signals:
void idChanged();
};
class EmployeeData : public TableData {
Q_OBJECT
public:
EmployeeData() : TableData(), _age(-1), _name("") {}
int age() const { return _age; }
void setAge(int newAge) {
_age = newAge;
emit ageChanged();
}
QString name() const { return _name; }
void setName(QString newName) {
_name = newName;
emit nameChanged();
}
protected:
Q_PROPERTY(int age
READ age
WRITE setAge
NOTIFY ageChanged)
int _age;
Q_PROPERTY(QString name
READ name
WRITE setName
NOTIFY nameChanged)
QString _name;
signals:
void ageChanged();
void nameChanged();
};
Метод void TableData::setField(const char *, QVariant);
вызовет void QObject::setProperty(const char *, QVariant);
. Последнее автоматически вызовет установщик, указанный вами в поле свойства WRITE
, чтобы обновить значение свойства. Следующие три фрагмента кода точно так же делают:
Использование установщиков атрибутов:
EmployeeData ed;
ed.setId(5);
ed.setAge(11);
ed.setName("Son Gohan");
Использование void TableData::setField(const char *, QVariant);
:
EmployeeData ed;
ed.setField("id", 5);
ed.setField("age", 11);
ed.setField("name", "Son Gohan");
Использование void QObject::setProperty(const char *, QVariant);
(поскольку ваш EmployeeData
также является QObject
):
EmployeeData ed;
ed.setProperty("id", 5);
ed.setProperty("age", 11);
ed.setProperty("name", "Son Gohan");
То же самое для чтения атрибутов. Ваш QVariant TableData::getField(const char *) const;
метод вызовет QVariant QObject::property(const char *) const;
. Последнее автоматически вызовет получатель, указанный вами в поле свойства READ
, чтобы получить значение свойства. Следующие три фрагмента кода точно так же делают:
Использование установщиков атрибутов:
// Using the EmployeeData ed defined above
int id = ed.id(); // id == 5
int age = ed.age(); // age == 11
QString name = ed.name(); // name == "Son Gohan"
Использование QVariant TableData::getField(const char *) const;
:
// Using the EmployeeData ed defined above
int id = ed.getField("id").toInt(); // id == 5
int age = ed.getField("age").toInt(); // age == 11
QString name = ed.getField("name").toString(); // name == "Son Gohan"
Использование QVariant QObject::property(const char *) const;
(поскольку ваш EmployeeData
также является QObject
):
// Using the EmployeeData ed defined above
int id = ed.property("id").toInt(); // id == 5
int age = ed.property("age").toInt(); // age == 11
QString name = ed.property("name").toString(); // name == "Son Gohan"