QObject 属性及说明
- QT官方文档:https://doc.qt.io/qt-5/qobject.html
- QObject类是所有Qt对象的基类。
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()
属性:
- objectName : QString
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() 接收事件,并过滤其他对象的事件。
- 详见installEventFilter() 和 eventFilter() 。
- 可以重新实现一个方便的处理程序 childEvent()来捕获子事件。
- QObject提供了Qt中基本的定时器支持;请参阅 QTimer以获得对计时器的高级支持。
- 请注意, Q_OBJECT宏对于任何实现信号、插槽或属性的对象都是强制的。
- 您还需要在源文件上运行元对象编译器( Meta Object Compile)。
- 我们强烈建议在QObject的所有子类中使用这个宏,不管它们是否实际使用信号、插槽和属性,因为如果不这样做可能会导致某些函数表现出奇怪的行为。
- 所有Qt小部件都继承了QObject。
- 函数 isWidgetType()返回一个对象是否是一个小部件。它比qobject_cast<QWidget *>((obj)或obj->inherits("QWidget")快得多。
- 一些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创建的窗体上的小部件之间能够执行自动连接。
- 更多关于使用Qt设计器的自动连接的信息,在Qt设计器手册的“Using a Designer UI File in Your C++ Application ”一节中给出。
动态特性(Dynamic Properties)
- 在Qt 4.2中,可以在运行时向QObject实例中添加或删除动态属性。
- 动态属性不需要在编译时声明,但它们提供了与静态属性相同的优势,并且使用相同的API进行操作——使用property()读取它们,使用setProperty()编写它们。
- 从Qt 4.3开始,Qt Designer就支持动态属性,并且标准的Qt小部件和用户创建的表单都可以被赋予动态属性。
国际化(I18n)
- 所有QObject的子类都支持Qt的翻译功能,这使得将应用程序的用户界面翻译成不同的语言成为可能。
- 要使用户可见的文本可翻译,必须将其包装在对 tr()函数的调用中。这在 Writing Source Code for Translation 有详细说明。
- 参考: QMetaObject, QPointer, QObjectCleanupHandler, Q_DISABLE_COPY(),和 Object Trees & Ownership。
属性文档
【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)
- 注意 : 这是一个私有信号。它可以用于信号连接,但不能由用户发出。
- 参考: metaObject() 和QMetaObject::className().