Q_GADGET 与 Q_OBJECT

2023-05-16

文章目录

  • 1. 元对象系统The Meta-Object System
  • 2. `Q_OBJECT`宏
  • 3. `Q_Gadget`宏
  • 4. 属性系统
  • 5. 属性的声明

1. 元对象系统The Meta-Object System

Qt的元对象系统提供了用于对象间通信的信号和槽机制(signals and slots)运行时类型信息( run-time type information)动态属性系统(dynamic property system)
元对象系统基于三个方面:

  • QObject类的派生类。
  • 在类声明前使用Q_OBJECT()宏来开启元对象功能,如动态属性、信号和槽。
  • 元对象编译器(MOC)为每个QObject派生类提供实现元对象功能所需的代码。

2. Q_OBJECT

Q_OBJECT宏可以赋予类元对象系统的三大功能:信号和槽机制(signals and slots)运行时类型信息( run-time type information)动态属性系统(dynamic property system)
Q_OBJECT宏要求类必须是QObject的子类,Q_OBJECT宏必须出现在类定义的私有部分中,该类定义声明自己的信号和槽,或者使用Qt的元对象系统提供的其他服务

3. Q_Gadget

Q_Gadget宏是Q_OBJECT宏的轻量级版本,适用于不继承QObject但仍希望使用QMetaObject提供的一些反射功能的类。
Q_Gadgets可以有Q_ENUMQ_PROPERTYQ_INVOKABLE,但它们不能使用信号和槽。

4. 属性系统

Qt有一个复杂的属性系统,它基于元对象系统,作为独立于编译器和平台的库。Qt解决方案适用于Qt支持的所有平台上的任何标准C++编译器。

5. 属性的声明

使用Q_PROPERTY()宏来声明属性,其格式为:

// []中是可选项
Q_PROPERTY(type name
             (READ getFunction [WRITE setFunction] |
              MEMBER memberName [(READ getFunction | WRITE setFunction)])
             [RESET resetFunction]
             [NOTIFY notifySignal]
             [REVISION int]
             [DESIGNABLE bool]
             [SCRIPTABLE bool]
             [STORED bool]
             [USER bool]
             [CONSTANT]
             [FINAL])

其中属性名和READ(MEMBER)是必选项,其他是可选项。type可以是任何QVariant支持的类型。
下面是一个案例:

class Customer : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(QString phone MEMBER m_phone NOTIFY phoneChanged)
    Q_PROPERTY(QDate dateEstablished READ getDateEstablished CONSTANT) // Read-only
    Q_PROPERTY(CustomerType type READ getCustomerType CONSTANT) // Read-only
    Q_PROPERTY(QString address READ getAddress WRITE setAddress)
public:
    enum CustomerType {
        Corporate, Individual, Educational, Government
    };
    Q_ENUM(CustomerType)
    Customer(CustomerType type, const QDate &dateEstablished, QObject* parent = nullptr);
    QString getName() const;
    void setName(const QString &name);

    QDate getDateEstablished() const;
    CustomerType getCustomerType() const;
    QString getAddress() const;
    void setAddress(const QString &address);
signals:
    void nameChanged();
    void phoneChanged();
    void addressChanged();
private:
    QString m_name;
    QString m_phone;
    QDate m_dateEstablished;
    CustomerType m_customerType;
    QString m_address;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Q_GADGET 与 Q_OBJECT 的相关文章

  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 将值添加到对象类型c#

    我有这样的对象 object rt new page 1 现在我如何向该对象添加新值 我的意思是这样的 rt code 5 这怎么可能呢 听起来更像是你想要一个Dictionary
  • 如何递归地将嵌套对象数组转换为平面对象数组?

    我有以下深度嵌套对象数组 const data name foo children count 1 name A count 2 name B name bar children count 3 name C children count
  • 创建动态对象

    如何动态创建对象 string columnNames EmpName EmpID PhoneNo List
  • 如何获取Python对象父级?

    所以 我试图获取自定义对象 内部 的对象 这是一个例子 假设 o 是一个对象 无论是什么类型 它都可以存储变量 o Object class Test def init self self parent o This is where I
  • C# 无法覆盖继承的成员

    我正在从一本名为 Chegwidden Gladdis 的书中学习 C 我正在制作与书中编写的相同的程序和相同的代码 但有一个问题 我无法重写父类中的方法 我从章节一开始就读完了这本书 读了五遍 一切都是一样的 但我不明白为什么我不能重写父
  • 如何在 Python 中创建对象的副本?

    我想创建一个对象的副本 我希望新对象拥有旧对象的所有属性 字段的值 但我想要有独立的对象 因此 如果我更改新对象的字段值 旧对象不应受到影响 要获得对象的完全独立的副本 您可以使用copy deepcopy http docs python
  • 在 JavaScript 中按值对字典进行排序

    这是我的字典 const dict x 1 y 6 z 9 a 5 b 7 c 11 d 17 t 3 我需要一种方法来排序我的dict字典从最小到最大或从最大到最小 或者即使我有一个包含排序键的数组也很好 但我不知道如何使用来做这样的事情
  • 找出对象列表中是否包含具有指定字段值的内容?

    我有一个从数据库收到的 DTO 列表 它们有一个 ID 我想确保我的列表包含具有指定 ID 的对象 显然 在这种情况下创建具有预期字段的对象不会有帮助 因为 contains 调用 Object equals 并且它们不会相等 我想出了这样
  • PHP foreach 数组与 stdClass 对象

    我需要帮助尝试获取数组和 stdClass 对象内的值 仅供参考 我正在使用 foursquare API 我有这样的事情 fsq groups venues gt response gt groups echo pre print r f
  • TypeError:“NoneType”对象不可下标[重复]

    这个问题在这里已经有答案了 错误 names curfetchone 0 TypeError NoneType object is not subscriptable 我尝试检查缩进 但仍然有错误 我读到 如果数据库中没有文件名记录 变量名
  • Typescript 继承:扩展基类对象属性

    当扩展一个类时 我可以轻松地向它添加一些新属性 但是 如果当我扩展基类时 我想向基类的对象 简单对象的属性 添加新属性怎么办 这是一个带有一些代码的示例 基类 type HumanOptions alive boolean age numb
  • Python 中的方括号和点符号有什么区别?

    我来自 Javascript 背景 可以通过以下方式访问属性 and 符号 所以请原谅我 但是 Python 中两者之间到底有什么区别 从我的实验看来 应该始终使用 两者都可以获取 a 的索引list or set并从 a 中的某个键获取值
  • 在 Groovy 中分配对象属性的简写方法?

    我使用此约定创建 Groovy 对象 Item item1 new Item name foo weight 150 是否有操作属性对象的速记约定 像这样的东西 item1 name hello weight 175 this does n
  • 将文本文件扫描到对象数组中

    我有一个逗号分隔的文本文件 其信 息格式如下 名字 姓氏 餐1 餐2 餐3 餐4 每个新学生都在新的一行 我有以下学生对象 public class Student private String first null private Str
  • 为什么这个对象属性未定义?

    考虑下面的代码 首先console log正确记录图像 您可以在下图中看到其属性 但是 当我尝试将其属性记录到控制台时 我得到undefined console log that data 0 cards works see image b
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • 在Python中将字典转换为以键作为对象名称的对象

    我有一本这样的字典 d item1 Hi 150 495 item2 Hola 590 40 我想将其转换为对象 如果可能的话递归地 我有一堂课 class Item def init self thetuple self greeting
  • Java控制台显示对象的地址而不是实际值[重复]

    这个问题在这里已经有答案了 好的 我正在用 Java 处理一个简单的数组 问题是 当我运行程序时 我得到的是对象的地址而不是实际值 我还发现循环 数组有问题 它应该显示房屋 3 5 和 7 但底部显示的是 3 4 和 5 我哪里出错了 请参
  • 匹配数组中的对象并合并

    UPDATE 我有一个名为的对象数组cars包含 li 标签 其中包含有关汽车的属性数据 例如价格 汽车类型等 我的目标是 如果这些汽车符合某些标准 则将它们合并到一个列表中 要求 快速性能 保持相同的汽车数组结构 Main Goal Ma

随机推荐