带继承的Qt强制转换

Qt cast with inheritance

本文关键字:转换 Qt 继承      更新时间:2023-10-16

我有Node

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;
};

在函数运行中,我希望可以操作子对象的属性。如果我调用run-on-NodeA对象,在run方法中,我不能用这个->属性("_a")访问_a属性。

所以我找到的解决方案是:在Node中声明const QMetaObject * _metaObject;和在每个子类的构造函数中_metaObject = metaObject();

这样,在run方法中,我可以使用_metaObject->cast(this)->property("_a");访问_a属性。

但是,我不喜欢在每个子类的构造函数中执行_metaObject = metaObject();

我认为使用虚拟函数可以解决这个问题。例如:

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()