2015-11-03 47 views
-1

我嘗試實施樣[自我描述實體]像這樣Qt的C++:如何存儲函數指針在地圖時的功能有不同的參數類型

//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) 
    } 
} 

我2個問題是:

  1. 如何創建1個函數指針& propSetter地圖所有不同的數據類型
  2. 我知道函數指針signatural特定於實體類。我如何使用這個實體類作爲基類,並重用派生類的屬性setter的SetValue函數?
+3

看起來你正在重新編碼Qt屬性系統,而沒有真正解釋你爲什麼要這樣做,因爲它已經存在,是否有可能是Qt屬性系統不適合你的原因? 該文檔在[Qt Property System](http://doc.qt.io/qt-5/properties.html)上相當不錯,請關注[閱讀文章](http://doc.qt。 io/qt-5/properties.html#閱讀和寫作屬性與元對象系統)屬性 –

+0

你救了我的生命...這樣一個noob問題...! :D我只是開始學習Qt幾天,並試圖爲我的項目構建ORM。不知道這個物業系統存在!許多感謝和尊重! :) –

回答

0

非常感謝The Badger !!!

從來沒有想過它已經存在。

只需使用的setProperty功能

Enity *obj = new Entity(); 
obj->setProperty("Id", 1); 
obj->setProperty("Text", "Some text"); 

感覺愚蠢!

相關問題