如何将 Qt 属性与自定义类一起使用?
Posted
技术标签:
【中文标题】如何将 Qt 属性与自定义类一起使用?【英文标题】:How to use Qt properties with custom classes? 【发布时间】:2015-02-17 04:06:52 【问题描述】:所以我开始在 C++ 中掌握 Qt 的 MOC 系统的窍门,并且一直在使用 Q_PROPERTY 宏和相关功能来自省 Qt 内置类型。但是我似乎找不到为自定义类型定义属性的方法。
例如,在下面的代码中,我可以使用 metaObjects 来识别、读取和写入变量 A,它是 TestParent 的成员,使用 Q_PROPERTY 和两个相应的函数。但是,尝试注册任何自定义类型 Child 都会给我错误
QObject::QObject(const QObject&) 在这个上下文中是私有的
我知道这是因为 Child 继承自 QObject,但我也想在 Child 类中使用 Qt 的属性系统,这需要从 QObject 继承。有没有正确的实现方式?
class Child : public QObject
Q_OBJECT //Q_OBJECT macro required here for the MOC to use introspection
public:
explicit Child(QObject *parent = 0);
~Child();
;
class TestParent : public QObject
Q_OBJECT
Q_PROPERTY(int A READ A WRITE setA) //this works
Q_PROPERTY(Child child READ child WRITE setChild) //this doesn't
public:
explicit TestParent(QObject *parent = 0);
~TestParent();
void setA(int A) _A = A;
int A() const return _A;
void setChild(Child c) _child = c;
Child child() const return _child;
private:
int _A;
Child _child;
;
TestParent 和 Child 的构造函数和析构函数都是在 .cpp 文件中实现的空白方法
谢谢。
【问题讨论】:
从 QObject 派生的对象不能被复制。您需要使用指针。 【参考方案1】:啊,现在明白了。感谢退休忍者。
对于寻找这个的其他人来说,它最终是
class TestParent : public QObject
Q_OBJECT
Q_PROPERTY(Child * child READ child WRITE setChild)
public:
explicit TestParent(QObject *parent = 0);
~TestParent();
void setChild(Child *c) _child = c;
Child * child() const return _child;
private:
Child * _child;
;
但不要忘记初始化那个指针!
【讨论】:
【参考方案2】:您需要实现赋值运算符和复制构造函数以按值使用您的 Child 属性(如在您的代码中,而不是来自先前注释的按指针)。如果您将按指针使用它,请不要忘记在创建时将 parent 设置为此属性(因此您不需要直接销毁它)
所以,这是一个例子:
#pragma once
#include <QObject>
class Child : public QObject
Q_OBJECT
public:
Child() = default;
Child(const Child &other, QObject *parent = nullptr)
: QObject(parent)
Q_UNUSED(other);
public:
Child& operator =(const Child &other)
Q_UNUSED(other);
return *this;
;
class TestParent : public QObject
Q_OBJECT
Q_PROPERTY(int a READ a WRITE setA NOTIFY aChanged)
Q_PROPERTY(Child child READ child WRITE setChild NOTIFY childChanged)
public:
TestParent() = default;
signals:
void aChanged();
void childChanged();
public:
void setA(const int &a) _a = a;
const int& a() const return _a;
void setChild(Child c) _child = c;
const Child& child() const return _child;
private:
int _a;
Child _child;
;
【讨论】:
以上是关于如何将 Qt 属性与自定义类一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 将 AFNetworking 与自定义 NSURLProtocol 类一起使用
将 QAbstractTableModel 实现与自定义类的 QList 一起使用