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 的相关文章

  • TypeScript 扩展模块中的对象

    我想做的事情确实类似于this https stackoverflow com questions 12802383 extending array in typescript and this https stackoverflow co
  • 查找数组中值最接近的对象

    我需要通过最接近的值获取数组中的对象 让我通过一个例子来解释一下 const data age 52 age 53 age 54 age 60 some data age 66 something else age 72 age 78 ag
  • Kendo UI - observable、ObservableObject 和 Model 之间的区别

    observable ObservableObject 和 Model 之间有什么区别 谢谢 Model继承自ObservableObject 而ObservableObject又继承自Observable 可观察的 http docs k
  • java中引用和对象有什么区别? [复制]

    这个问题在这里已经有答案了 我有类 GUI 所以我可以创建这样的对象 GUI g1 new GUI 和一个像这样的引用变量 GUI g2 现在据我所知 g2 是一个引用变量 它引用 GUI 类 而 g1 是 GUI 类的对象 g1和g2有什
  • 使用数组字段代替大量对象

    鉴于本文 http www simple talk com dotnet net framework object overhead the hidden net memory allocation cost 我想知道人们在内存中使用数组存
  • 如何转换该对象数组?

    我有个问题 我有该对象数组 const iHaveThis question What s your name answer dda form filled key 15 question What s your e mail answer
  • 在 Javascript 中获取类的所有实例

    我以为这个问题已经有了答案 但我似乎找不到答案 如何在 Javascript 中的此类的所有实例上运行特定的类方法 这必须在我不知道实例名称的情况下完成 我想我可以在类中使用某种静态变量来存储所有实例 但这在 JS 中似乎不存在 那么如何在
  • java hashmaps 的 get() 函数

    我声明了以下哈希图 HashMap
  • stdClass 类的对象无法转换为字符串

    我现在在使用 PHP 时遇到问题 收到此错误 Object of class stdClass could not be converted to string当我在我的网站中运行这部分代码时发生错误 function myaccount
  • 如何在java hashset中查找并返回对象

    根据 HashSet javadoc HashSet contains 仅返回布尔值 如何在 hashSet 中 查找 对象并修改它 它不是原始数据类型 我看到 HashTable 有一个 get 方法 但我更喜欢使用该集合 您可以删除一个
  • VBScript 中的对象/类字典

    vbscript 中是否可以有对象 类的字典 例如 Class employeeclass Public first last salary End Class Dim employeedict Set employeedict Creat
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • 为什么.NET中的每个类都继承自Object?

    我不明白 为什么他们需要一个共同的基础 这个问题预设了一个谎言 他们不need一个共同的基础类型 这个选择并不是出于必要 这是出于为客户提供最佳价值的愿望 当设计类型系统或任何其他相关问题时 有时您会遇到决策点 您必须决定 X 或非 X 公
  • angular.copy() 和 JSON.parse(JSON.stringify()) 之间的区别?

    有人可以解释 angular copy 和 JSON parse JSON stringify 之间的区别吗 有吗 您会推荐使用什么 angular fromJson angular toJson 与 JSON parse JSON str
  • 如何在 PHP 中对数组和数据进行排序?

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

    这个问题的答案 JavaScript 函数的原型属性的初始值是多少 https stackoverflow com questions 4073677 what is the initial value of a javascript fu
  • JavaScript 数组和对象除了 .length 属性之外有什么区别?

    我认为 JS 数组只是一个哈希映射 它只接受整数值作为键 length 属性只返回最大索引 1 这是正确的吗 还有其他区别吗 您错了 数组可以有任何你想要的键 此外 他们还继承了Array原型
  • 如何从一维数组和静态字符串创建对象

    我想要一个像 var obj ABC name true dob true CDE name true dob true EFG name true dob true CBA name true dob true XYZ name true
  • 如何从嵌套的对象数组中获取每个父级的值

    所以我有多个对象数组 每个对象都包含一个子对象 e g const data id 1 name parent 1 children id c1 name child 1 children id g1 name grand 1 childr
  • 将多维数组转换为单数组(Javascript)

    我有一个对象数组 来自 XLSX js 解析器 因此其长度和内容各不相同 表示已给予项目的资助 简化后 它看起来像这样 var grants id p 1 location loc 1 type A funds 5000 id p 2 lo

随机推荐