2014-09-01 67 views
0

我有類NodeQt的鑄有繼承

class Node : public QObject 
{ 
Q_OBJECT 
public: 
    Node(QObject* p) : QObject(p){} 
    void run() 
    { 
     //access to property 
     runImplementtation(); 
    } 
    virtual void runImplementation() = 0; 
}; 

我有類NodeA

class NodeA : public Node 
{ 
Q_OBJECT 
Q_PROPERTY(double _a READ a WRITE setA) 
public: 
    NodeA(QObject* p=NULL) : Node(p){} 
    void runImplementation() {} 
    double a() const { return _a; } 
    void setA(double a) { _a = a;} 
private: 
double _a; 
}; 

在功能方面來看,我想可以操縱的特性子對象。 如果我調用NodeA對象上的run,在run方法中,我無法使用this-> property(「_ a」)訪問_a屬性。

於是,我找到了解決辦法是: 申報Node const QMetaObject * _metaObject; 並在每個子類 _metaObject = metaObject();

在這種的構造,在運行的方法,我可以訪問_a財產與_metaObject->cast(this)->property("_a");

但是,我不得不在每個子類的構造函數中做_metaObject = metaObject();

+0

挑剔:QObject的應該接受一個'* QObject的P = 0'in傳遞給構造超級構造函數 – 2014-09-01 10:29:42

+0

您是否嘗試在'run()'或'runImplementation()'中訪問它? – lazycoder 2014-09-01 10:42:02

+0

我調用runImplementation的run方法。 – artoon 2014-09-01 10:48:38

回答

2

我想你可以使用虛函數來解決這個問題。例如:

class Node : public QObject 
{ 
public: 
    [..] 
    virtual void run() {...} 
    [..] 
}; 

class NodeA : public Node 
{ 
Q_OBJECT 
Q_PROPERTY(double _a READ a WRITE setA) 
public: 
    [..] 
    virtual void run() 
    { 
     // access the _a property with property("_a"); 
     // The Node::run() also can be called here. 
    } 
    [..] 
}; 

以及如何使用這樣的:

Node *node = new NodeA(...); 
node->run(); // will call NodeA::run() 
+0

是的,這是一個好主意,但我希望儘可能地進行概括。 – artoon 2014-09-01 10:46:00