使用派生类添加属性并保持与现有类的兼容性

Use derived class to add properties and maintain compatibility with existing classes

提问人:Mark 提问时间:2/9/2022 更新时间:2/9/2022 访问量:23

问:

我正在编写一个在 Ubuntu 20.04 中运行的 Qt 6.2.0 应用程序。 我的目标是将属性添加到现有类中。 所以我写道:QtOpcUaNode

class MyOpcUaNode : public QOpcUaNode
{
    Q_OBJECT

public:
    explicit MyOpcUaNode(QOpcUaNode *parent = nullptr) : QOpcUaNode(parent) { }
    bool updated;
};

但这里的第一个错误:

error: no matching function for call to ‘QOpcUaNode::QOpcUaNode(QOpcUaNode*&)’
In file included from ../MyProject/myproject.cpp:1:
../MyProject/myproject.h: In constructor ‘MyOpcUaNode::MyOpcUaNode(QOpcUaNode*)’:
../MyProject/myproject.h:16:73: error: no matching function for call to ‘QOpcUaNode::QOpcUaNode(QOpcUaNode*&)’
   16 |     explicit MyOpcUaNode(QOpcUaNode *parent = nullptr) : QOpcUaNode(parent) { }
      |                                                                         ^

我想以这种方式使用我的类:

QList<MyOpcUaNode *> _listOpcNodes;

_listOpcNodes.append(MyOpcUaNode(_opcUaClient->node("ns=4;s=MEM_RUN_LINE")));
...
_listOpcNodes[x]->updated = true;

我的方法正确吗?

我尝试了没有复制构造函数,但我不确定如何将 .尝试:QOpcUaNode *MyOpcUaNode *

MyOpcUaNode *node = qobject_cast<MyOpcUaNode *>(_opcUaClient->node("ns=4;s=MEM_RUN_LINE"));

lead 成为指针(即使 是正确的)。nodenull_opcUaClient->node

Qt 继承 复制构造函数 QT6

评论

0赞 chehrlic 2/9/2022
QOpcUaNode 没有公共 ctor,因此您无法从中派生
0赞 Mark 2/9/2022
那么,为了向其添加属性,您有什么建议呢?因为我需要标记在发出信号时更新列表的元素。OpcUaNode::attributeRead

答:

1赞 HiFile.app - best file manager 2/9/2022 #1

如果你想给继承自 的类添加属性,你可以用 https://doc.qt.io/qt-5/qobject.html#setProperty 来做到这一点。好吧,它不是类型安全的,但它非常简单。有时实用主义胜过纯粹主义。QObjectsetProperty()