从类名转换而来

时间:2014-09-01 14:23:47

标签: c++ qt casting

如何从类名转换指针thisthis是对象的指针,它继承QObject形式。

我试过metaObject->cast(this),但是如何从类名中获取QMetaObject?

修改 我有一个班级Node

class Node : public QObject
{
Q_OBJECT
public:
Node(QObject* p = NULL):QObject(p){}
virtual void runImplementation() = 0;
void run() 
{
    //initialize all input properties        
    ...        
    runImplementation();
}
void setInputValue(QMap<QString, QVariant> inputsValue) { _inputsValue = inputsValue;}
private:
QMap<QString, QVariant> _inputsValue;
};

班级NodeA

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

和一个班级NodeB

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

在方法run中,我想用地图中包含的值初始化所有输入属性。

NodeB nodeB;
QMap<QString, QVariant> inputB;
QVariant varDouble;
varDouble.setValue(5.4);
inputB.insert(QString("_a"), varDouble);
QVariant varInt;
varInt.setValue(3);
inputB.insert(QString("NodeA:_a"), varInt);
nodeB.setInputValue(inputB);
nodeB.run();

所以在run方法中我迭代地图,

  • 我想将指针this投射到我的对象的真实类型中 (NodeB)。这是我的第一个问题。有了这个,我可以访问 财产double _a。目前我用QVariant v = this->metaObject()->cast(this)->property(...);执行此操作但是它有用吗?
  • 我希望在类型(this)中投射指针NodeA。这个 是我的第二个问题。有了这个,我可以访问属性int _a

1 个答案:

答案 0 :(得分:2)

您可以使用static_cast<NodeA*>(this)dynamic_cast<NodeA*>(this),但绝不能这样做。因为基类永远不会知道它实际上是派生的实例。而是使用您的虚拟方法runImplementation来初始化从Node继承的类。

良好的初始化将如下所示:

NodeB b;
b.load(map);

class NodeB
{
   virtual void load(QVariantMap map) override
   {
     loadMyself(map);
     NodeA::load(map); // or even better: NodeA::load(map["base"].toMap());
   }
}

class NodeA
{
   virtual void load(QVariantMap map) override
   {
     loadMyself(map);
     Node::load(map); // or even better: Node::load(map["base"].toMap());
   }
}

class Node
{
   virtual void load(QVariantMap map)
   {
     loadMyself(map);
   }
}

编辑:

Qt属性的初始化 要访问Qt属性,您不需要指向添加了不动产的类实例的指针 只需使用this->property("_a")this->property("_b")但是属性名称应该是唯一的。当您在_a中声明属性NodeB时,您会覆盖_a中的属性NodeA,并且它将再次通过Qt元系统无法访问。