如何从类名转换指针this
?
this
是对象的指针,它继承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
。答案 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元系统无法访问。