【发布时间】:2015-11-03 04:30:12
【问题描述】:
我正在尝试像这样实现一种[自我描述实体]
//entity.h
class Entity : public QObject
{
Q_OBJECT
Q_PROPERTY(long Id READ Id WRITE setId NOTIFY IdChanged)
Q_PROPERTY(QString Text READ Text WRITE setText NOTIFY TextChanged)
private:
long _id;
QString _text;
typedef void (Entity::*LongFnPtr)(long);
std::map<std::string, LongFnPtr> longSetter;
typedef void (Entity::*StringFnPtr)(QString);
std::map<std::string, StringFnPtr> stringSetter;
public:
Entity();
void SetValue(std::string propName, long value);
void SetValue(std::string propName, QString value);
//Id Property
long Id();
void setId(long id);
//Text Property
QString Text();
void setText(QString text);
}
和
//entity.cpp
Entity::Entity()
{
this->longSetter["Id"] = &Entity::setId;
this->stringSetter["Text"] = &Entity::setText;
}
long Entity::Id(){
return _id;
}
void Entity::setId(long id){
_id = id;
}
QString Entity::Text(){
return _text;
}
void Entity::setText(QString text){
_text = text;
}
void Entity:SetValue(std::string propName, long value){
if (longSetter[propName]){
(this->*longSetter[propName](value)
}
}
void Entity:SetValue(std::string propName, QString value){
if (stringSetter[propName]){
(this->*stringSetter[propName](value)
}
}
我的两个问题是:
- 如何为所有不同的数据类型创建 1 个函数指针和 propSetter 映射
- 我知道函数指针签名是特定于实体类的。如何将此实体类用作基类并将这些 SetValue 函数重用于派生类的属性设置器?
【问题讨论】:
-
看起来您正在重新编码 Qt 属性系统,但没有真正解释为什么要这样做,因为它已经到位,可能是 Qt 属性系统不适用于的原因你? Qt Property System上的Docs相当不错,注意Reading an Writing属性
-
你救了我的命……真是个菜鸟问题……! :D 我刚刚开始学习 Qt 几天并尝试为我的项目构建 ORM。不知道这个属性系统存在!非常感谢和尊重!!! :)
标签: c++ qt function pointers dictionary