QT基础 - QObject简介

QT基础 - QObject简介


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

目录


环境:
QT版本:5.6.2


详细说明

QObject类是所有Qt对象的基类。

QObject是Qt对象模型的核心。这个模型的核心特征是一个非常强大的称为信号和槽的无缝对象通信机制。您可以使用connect()将信号连接到插槽,并使用disconnect()销毁连接。为了避免永不结束通知循环,可以使用blockSignals()暂时阻止信号。受保护的函数connectNotify()和disconnectNotify()使跟踪连接成为可能。

QObject在对象树中组织自己。当你用另一个对象作为父对象创建一个QObject时,对象将自动添加到父对象的children()列表中。父母拥有对象的所有权;即它会自动删除其子析构器中的子元素。您可以按名称查找对象,也可以使用findChild()或findChildren()来查找对象。

每个对象都有一个objectName(),它的类名可以通过相应的metaObject()来找到。您可以使用inherits()函数确定对象的类是否继承QObject继承层次结构中的另一个类。

当一个对象被删除时,它会发出一个被破坏的destroyed()信号。您可以捕获此信号以避免对QObject的悬挂引用。

QObject可以通过event()接收事件并过滤其他对象的事件。有关详细信息,请参阅installEventFilter()和eventFilter()。可以重新实现便利处理程序childEvent()来捕获子事件。

扫描二维码关注公众号,回复: 1173385 查看本文章

最后但并非最不重要的是,QObject在Qt中提供了基本的定时器支持。

注意Q_OBJECT宏对于实现信号、槽或属性的任何对象都是必需的。您还需要在源文件上运行Meta Object Compiler。我们强烈建议在QObject的所有子类中使用此宏,而不管它们是否实际使用信号、槽和属性,因为如果不这样做可能会导致某些函数表现出奇怪的行为。

Qt中,所有的控件都派生自QObject。isWidgetType()函数可以判断一个对象是否是一个控件。它比qobject_cast

线程亲和性Thread Affinity

QObject实例具有线程亲和性,或者它存在于某个特定的线程中。当一个QObject收到一个排队的信号或一个发布的事件时,槽或事件处理程序将运行在该对象所在的线程中。

注意:如果QObject没有线程关联(即,如果thread()返回零),或者它存在于没有正在运行的事件循环的线程中,那么它不能接收排队的信号或发布的事件。

默认情况下,QObject存在于创建它的线程中。可以使用thread()查询对象的线程关系,并使用moveToThread()更改。

所有的QObject都必须和它们的父代在同一个线程中。所以:

  • 如果涉及的两个QObject存在于不同的线程中,setParent()将失败。
  • 当一个QObject被移动到另一个线程时,它的所有子对象也会自动移动。
  • 如果QObject有父项,moveToThread()将失败。
  • 如果在QThread::run()中创建QObject,则它们不能成为QThread对象的子对象,因为QThread不在调用QThread::run()的线程中。

注意:一个QObject的成员变量不会自动成为其子元素。父子关系必须通过传递指向子构造函数的指针或调用setParent()来设置。没有这一步,当moveToThread()被调用时,对象的成员变量将保留在旧线程中。

没有复制构造函数或赋值运算符No Copy Constructor or Assignment Operator

QObject既没有拷贝构造函数也没有赋值操作符。 这是设计。 实际上,它们是声明的,但在宏Q_DISABLE_COPY()的私有部分。 事实上,从QObject派生的所有Qt类(直接或间接)都使用这个宏来声明它们的拷贝构造函数和赋值运算符是私有的。 推理可以在Qt对象模型页面上关于Identity和Value的讨论中找到。

主要的结果是你应该使用指向QObject(或者你的QObject子类)的指针,否则你可能会试图使用你的QObject子类作为一个值。 例如,如果没有复制构造函数,则不能使用QObject的子类作为要存储在其中一个容器类中的值。 你必须存储指针。

自动连接Auto-Connection

Qt的元对象系统提供了一种机制来自动连接QObject子类和它们的子元素之间的信号和槽。 只要对象使用合适的对象名称进行定义,并且插槽遵循简单的命名约定,则可以在运行时通过QMetaObject :: connectSlotsByName()函数执行此连接。

uic生成调用此函数的代码,以便在使用Qt Designer创建的窗体上的窗口小部件之间执行自动连接。

动态属性Dynamic Properties

从Qt 4.2开始,动态属性可以在运行时添加到QObject实例中并从QObject实例中删除。 动态属性不需要在编译时声明,但它们提供了与静态属性相同的优点,并且使用相同的API进行操作 - 使用property()读取它们并使用setProperty()写入它们。

从Qt 4.3开始,Qt Designer支持动态属性,并且标准Qt小部件和用户创建的表单都可以被赋予动态属性。

国际化Internationalization (I18n)

所有的QObject子类都支持Qt的翻译功能,可以将应用程序的用户界面翻译成不同的语言。

为了使用户可见的文本可以翻译,它必须包装在对tr()函数的调用中。


Reference:
http://doc.qt.io/qt-5/qobject.html

觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
微信
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033

猜你喜欢

转载自blog.csdn.net/itas109/article/details/79977739