QT基础 - QObject简介

标签: QT QObject
7人阅读 评论(0) 收藏 举报
分类:

QT基础 - QObject简介


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

目录


环境:
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()来捕获子事件。

最后但并非最不重要的是,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技术交流群:12951803

查看评论

【Qt入门实践】QObject使用总结

QObject QObject是Qt所有对象的基类,是Qt对象模型(QtObject Model)的核心。Qt对象模型的主要特性是一个能让对象间无缝交流的强大机制:信号和槽。你可以使用connect(...
  • feng1790291543
  • feng1790291543
  • 2015-03-13 21:20:37
  • 1792

Qt使用多线程的一些心得——2.继承QObject的多线程使用方法

现在Qt官方并不是很推荐继承QThread来实现多线程方法,而是极力推崇继承QObject的方法来实现,当然用哪个方法实现要视情况而定,别弄错了就行,估计Qt如此推崇继承QObject的方法可能是QT...
  • czyt1988
  • czyt1988
  • 2017-05-05 11:39:15
  • 5862

Qt中 QObject类干了什么事情

QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));   QObject是所有类的根。Qt使用这个QObject实现了一个单...
  • cai_huan_123
  • cai_huan_123
  • 2014-02-12 21:30:11
  • 1031

Qt之线程和QObject

前面两个章节我们从事件循环和线程类库两个角度阐述有关线程的问题。本章我们将深入线程间得交互,探讨线程和QObject之间的关系。在某种程度上,这才是多线程编程真正需要注意的问题。 现在我...
  • xgy_123
  • xgy_123
  • 2014-03-15 23:33:42
  • 960

qt qthread类和qobject类

QThread从QObject派生。它发出信号来表明线程开始了或结束了。并且也提供了几个槽。更有趣的是,QObject可以在多个程中同时使用,可以发出信号给另外线程的槽,以及向“活在”另外线程中的对象...
  • u010165367
  • u010165367
  • 2016-04-30 17:30:12
  • 523

qt使用QTranslator QObject::tr(“”)软件国际化

1.      程序入口处添加如下代码: QTranslatortranslator; translator.load("uav_tr_la"); qApp->install...
  • iceboy314159
  • iceboy314159
  • 2017-04-22 07:51:08
  • 507

Qt源码分析之QObject

Qt的QObject1.试验代码:#include #include #include int main(int argc, char *argv[]){ QApplication app(argc,...
  • oowgsoo
  • oowgsoo
  • 2007-03-14 16:18:00
  • 17533

Qt中的“析构”机制、QObject *parent、注意事项

在C++中,使用new在堆中创建的对象,需要使用delete来析构对象,从而释放堆中的内存的。 在Qt中,往往new出来的对象却不需要我们手动delete,这是因为Qt替我们做了delete这件事。 ...
  • qq1623803207
  • qq1623803207
  • 2017-08-22 09:25:39
  • 289

Qt定时器:QObject类的定时器和定时器类QTimer

Qt定时器:QObject类的定时器和定时器类QTimer。
  • rl529014
  • rl529014
  • 2016-09-12 00:00:25
  • 1061

Qt自定义的类关于继承自QObject的出现的问题

之前的时候写的一个纯C++类运行的很好,但是移植到Qt中后,需要添加信号-槽函数。 之前的类是这样的: class MarkManager { public: MarkManager()...
  • wb175208
  • wb175208
  • 2018-01-18 15:58:35
  • 281
    公告
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 35万+
    积分: 4955
    排名: 7134
    博客专栏
    最新评论