2014-09-01 2 views
0

와 함께 캐스팅 NodeQt는 I 클래스를 상속

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 메서드에서 this-> 속성 ("_ a")으로 _a 속성에 액세스 할 수 없습니다.

그래서 내가 찾은 해결책은 다음과 같습니다 는 Node const QMetaObject * _metaObject; 에서 각 자식 클래스이와 _metaObject = metaObject();

의 생성자에서 선언 실행 방법, 나는 _metaObject->cast(this)->property("_a");와 _A 속성에 액세스 할 수 있습니다.

그러나 각 자식 클래스의 생성자에서 _metaObject = metaObject();을 수행해야한다고해서 만족스럽지 않습니다.

+0

nitpick : QObject를 수락해야'* QObject를 P =에 전달되는 생성자 0'in 슈퍼 생성자 –

+0

'run()'또는'runImplementation()'에 액세스하려고합니까? – lazycoder

+0

나는 runImplementation을 호출하는 run 메소드를 호출한다. – artoon

답변

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