QObject 属性及说明

QObject 属性及说明

Header:#include <QObject>
qmake:QT += core
  • 该类中的所有函数都是可重入的。
  • 这些函数也是线程安全的:
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
connect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const
connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
disconnect(const char *signal, const QObject *receiver, const char *method) const
disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
deleteLater()

属性:

Public Slots

void	deleteLater()

Signals

void	destroyed(QObject *obj = nullptr)

void	objectNameChanged(const QString &objectName)

详细说明

  • QObject是Qt对象模型(Object Model)的核心。
    • 该模型的核心特性是一个非常强大的机制,用于无缝对象通信,称为信号和插槽(signals and slots)。
    • 你可以用onnect() 连接一个信号到插槽,然后用disconnect()销毁连接。
    • 为了避免永远不会结束通知循环,你可以使用blockSignals()临时阻止信号。
    • 受保护的函数 connectNotify() 和disconnectNotify()使跟踪连接成为可能。
  • QObjects在对象树中(object trees)组织自己。
    • 当您创建一个QObject并将另一个对象作为父对象时,该对象将自动将自己添加到父对象的子列表( children())中。
    • 父对象拥有对象的所有权,也就是说,它会在析构函数中自动删除子对象。
    • 您可以使用 findChild()或 findChildren()按名称和可选类型查找对象。
  • 每个对象都有一个 objectName(),它的类名可以通过对应的 metaObject()找到(参见QMetaObject::className())。
    • 可以使用 inherits()函数确定对象的类是否继承QObject继承层次结构中的另一个类。
  • 当一个对象被删除时,它会发出一个destroyed()信号。您可以捕获此信号以避免悬空引用QObjects。
  • QObjects可以通过event() 接收事件,并过滤其他对象的事件。
  • QObject提供了Qt中基本的定时器支持;请参阅 QTimer以获得对计时器的高级支持。
  • 请注意, Q_OBJECT宏对于任何实现信号、插槽或属性的对象都是强制的。
    • 您还需要在源文件上运行元对象编译器( Meta Object Compile)。
    • 我们强烈建议在QObject的所有子类中使用这个宏,不管它们是否实际使用信号、插槽和属性,因为如果不这样做可能会导致某些函数表现出奇怪的行为。
  • 所有Qt小部件都继承了QObject。
  • 一些QObject函数,例如 children(),返回一个 QObjectList。QObjectList是QList<QObject *> 的类型定义。

线程关联性(Thread Affinity)

  • QObject实例具有线程关联,或者它位于某个线程中。
    • 当QObject接收到一个排队信号或一个已发布的事件时(queued signal or a posted event),插槽或事件处理程序将在对象所在的线程中运行。
  • 注意: 如果QObject没有线程关联(也就是说,如果thread()返回0),或者如果它存在于一个没有正在运行的事件循环的线程中,那么它就不能接收排队信号或发布的事件。
    • 默认情况下,QObject存在于创建它的线程中。对象的线程关联可以使用thread(()查询,并使用moveToThread()更改。
  • 所有的QObjects必须与它们的父对象在同一个线程中。结果:
    • 如果涉及的两个QObjects在不同的线程中,setParent() 将失败。
    • 当一个QObject被移动到另一个线程时,它的所有子对象也将被自动移动。
    • 如果QObject有一个父对象,moveToThread() 将失败。
    • 如果QObjects是在QThread::run()中创建的,它们不能成为QThread对象的子对象,因为QThread不在调用QThread::run()的线程中。
  • 注意:  QObject的成员变量不会自动变成它的子变量。
    • 父子关系必须通过向子构造函数( constructor)传递指针或调用 setParent()来设置。如果没有这一步,当moveToThread()被调用时,对象的成员变量将留在旧线程中。

没有拷贝构造函数或赋值操作符

  • QObject既没有拷贝构造函数,也没有赋值操作符。这是设计好的。
    • 实际上,它们是在宏Q_DISABLE_COPY()的私有部分中声明的。
    • 事实上,所有从QObject派生的Qt类(直接或间接)都使用这个宏来声明它们的拷贝构造函数和赋值操作符为私有。原因:在Identity vs Value on the Qt Object Model 中找到。
  • 主要的结果是,您应该使用指向QObject(或QObject子类)的指针,否则您可能会试图使用QObject子类作为值。
    • 例如,如果没有复制构造函数,就不能使用QObject的子类作为存储在某个容器类中的值。你必须存储指针。

自联接(Auto-Connection)

  • Qt的元对象系统提供了一种机制来自动连接QObject子类及其子类之间的信号和槽。
    • 只要用合适的对象名称定义对象,并且插槽遵循简单的命名约定,这个连接就可以在运行时由QMetaObject::connectSlotsByName()函数执行。
  • uic 生成调用此函数的代码,以使使用Qt Designer创建的窗体上的小部件之间能够执行自动连接。

动态特性(Dynamic Properties)

  • 在Qt 4.2中,可以在运行时向QObject实例中添加或删除动态属性。
    • 动态属性不需要在编译时声明,但它们提供了与静态属性相同的优势,并且使用相同的API进行操作——使用property()读取它们,使用setProperty()编写它们。
  • 从Qt 4.3开始,Qt Designer就支持动态属性,并且标准的Qt小部件和用户创建的表单都可以被赋予动态属性。

国际化(I18n)

属性文档

【objectName : QString

  • 此属性保存此对象的名称。
  • 可以使用 findChild()按名称(和类型)查找对象。您可以使用 findChildren()找到一组对象。
qDebug("MyClass::setPrecision(): (%s) invalid precision %f",
       qPrintable(objectName()), newPrecision);
  • 默认情况下,此属性包含一个空字符串。
  • 相关函数:
QString	objectName() const
void	setObjectName(const QString &name)
  • 通知信号:
void	objectNameChanged(const QString &objectName)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值