带继承的Qt强制转换
Qt cast with inheritance
我有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()
相关文章:
- 将Qt Designer项目转换为C++代码
- Qt 将字符串转换为以 16 为基数的 int,但保留以 16 为基数的值
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 在Qt中将QString转换为ASCII值,反之亦然
- 如何在Windows上将Qt QString转换为LPCTSTR
- 将Qt qml文件转换为位图图像
- 将 CRC uint 转换为 QByteArray QT - C++
- QT 创建器只会将第一个单词从文本编辑转换为纯文本
- QT中不允许使用一行多个转换,例如qString到char*
- C++ QList 中项目的 QT 强制转换到子类
- 编译错误 QT - 无法从类型强制转换
- 如何将Qt文件路径从资源转换为绝对路径?
- 将时间戳转换为纳秒 (Qt)
- 将Qt的QML代码转换为C++
- 将QString转换为uintptr_t,qt / c
- 如何在Qt中将带有YUV数据的"QVideoFrame"转换为具有RGBA32数据的"QVideoframe"?
- 没有成员命名 'setRawData' in 'QwtPlotCurve' - 转换 Qt 4.7 为 Qt 5.8
- 没有成员命名 'setResizeMode' in 'QHeaderView' - 转换 Qt 4.7 为 Qt 5.8
- 添加不带发送器和接收器的转换Qt 5.2