如何将 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 属性与自定义类一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 Tailwind 深色变体与自定义类一起使用

iOS - 将 AFNetworking 与自定义 NSURLProtocol 类一起使用

将 QAbstractTableModel 实现与自定义类的 QList 一起使用

将 Qt 与自定义 MinGW 一起使用

如何使 C++ 中的 for each 循环函数与自定义类一起使用

在 sklearn 中将 Pipeline 与自定义类一起使用