1、简介

QObject类是所有Qt对象的基类,是Qt对象模型的核心,这个模型的主要特征为信号与槽,信号与槽是一个非常重要的机制,用于对象间的通信。连接信号与槽使用connect()函数,断开连接使用disconnect()函数,blockSignals()函数可以临时屏蔽信号,避免循环不断的通知,另外,protected级别的connectNotify()disconnectNotify()函数还可用于跟踪信号与槽的连接关系。信号与槽的更过介绍可参照Qt文档Signals & Slots

QObject对象是一种对象树的形式,当创建一个QObject对象并指定另外一个对象为parent时,这个对象将自动把自己添加到parent的children()列表,这样,parent拥有这个对象的所有权,parent销毁时自动销毁children,可以通过名字(objectName)查找parent拥有的children,使用findChild()findChildren()函数。QObject对象树的更多介绍可参照Qt文档Object Trees & Ownership

每个对象都有一个objectName()函数,类名可以通过metaObject()函数获得(QMetaObject::className()),在QObject类的树状继承结构中,查看一个对象的类是否继承自另一个类,使用inherits()函数。

一个对象销毁时,发送destroyed()信号,可以捕获这个信号以避免对这个对象的无效引用。

QObject对象可以通过event()函数接收事件,还可以过滤其它对象的事件(相关函数为installEventFilter()eventFilter()),重写childEvent()函数还可以处理children的事件。

在Qt中QObject还提供了基本的timer,timer的高级功能可参照QTimer类。

Q_OBJECT是一个很重要的宏,QObject对象实现了信号、槽、属性时,这个宏是必需的,元对象编译器moc(Meta Object Compiler)需要用到这个宏,建议QObject的所有子类不管有没有用到信号、槽、属性都使用这个宏,否则有可能出现诡异的事情。moc相关说明可参照Qt文档Using the Meta-Object Compiler (moc)

所有的Qt Widget都继承自QObject类,判断一个QObject对象是否为Widget可以使用isWidgetType()函数进行判断,这个函数必其它方法更快,如qobject_cast<QWidget *>(obj)obj->inherits("QWidget")

Object的某些函数,如children(),返回类型为QObjectList,这个是用typedef定义的QList<QObject*>

2、线程相关性

QObject实例有线程相关性,或者说只存在于特定线程,当一个对象收到queued signal或者posted event时,其slot或者event handler将在这个对象所在的线程运行。如果一个QObject对象没有线程相关性,也就是说thread()函数返回NULL,或者这个对象所在的线程没有running event loop,这个对象是收不到queued signal和posted event的。QObject对象默认存在于创建时所在的线程,线程相关性通过thread()函数获得,转线程使用moveToThread()函数。所有的QObject对象与其parent都必须在同一个线程,两个对象不在同一个线程时setParent()函数将失败,一个对象转线程成功后其children也会转到同一个线程,使用moveToThread()函数转线程时相应的对象不能有parent,如果在QThread::run()函数中创建了QObject对象,这些对象不能作为QThread对象的children,因为QThread不在调用QThread::run()函数所在的线程。另外,QObject的成员变量默认也不是其children,父子关系只能是在构造函数中通过参数传入parent或者调用setParent()函数,如果没有父子关系,调用moveToThread()函数时成员变量还保留在原有的线程。signal与event的更多说明可参照Qt文档Qt NamespaceThe Event System

3、无拷贝构造和赋值操作符

QObject专门设计为没有拷贝构造函数和赋值操作符,通过Q_DISABLE_COPY()宏实现,其实就是在private部分声明拷贝构造函数和赋值操作符而没有实现它们。在QObject的所有子类中都使用了这个宏,这样做的目的是在QObject Model中,QObject作为一种id而非value,value是可以拷贝或赋值的,但id只能克隆,克隆意味着创建一个新的id,而不是精确地拷贝原来的那一个,克隆比拷贝构造和赋值操作要复杂的多,既然禁止拷贝构造和赋值操作这种方式获取value,结果也就是只能通过指针来存储访问了。关于QObject Model的介绍可参照Qt文档QObject Model

4、自动连接

Qt的元对象系统提供了在QObject子类与其children之间自动连接信号与槽的机制,只要QObject对象设置了适当的objectName,并且slot的名字命名规范,就可以在运行时通过QMetaObject::connectSlotByName()函数完成连接。uic(User Interface Compiler)工具可以自动生成代码,在Qt Designer创建的Form中的Widget之间,以invoke某些函数用于自动连接。更多关于Qt Designer的自动连接可参照Qt文档Using a Desianger UI File in Your Application

5、动态属性

从Qt4.2开始,在运行时可以给一个QObject实例动态地添加或移除属性,动态属性是不需要在编译时声明的,与静态属性有同样的优势,使用相同的API进行读写property()setProperty()。从Qt4.3开始,Qt Designer也支持动态属性了,包括静态的Qt Widget和用户自定义的Form。

6、I18N

I18N即Internationalization,在I与N之间还有18个英文字母,是一种简写,国际化的意思。所有的QObject子类都支持Qt的翻译功能,用于翻译一个应用程序的用户接口(API)为不同的语言。为了使得用户可见的文本为可翻译的,必须使用tr()函数进行包装转换。详细用法可参照Qt文档Writing Source Code for Translation

【QT】QObject简介相关推荐

  1. Qt 与 Qt Creator 简介

    该文章原创于Qter开源社区(www.qter.org),作者 yafeilinux,转载请注明出处! 一.Qt 与 Qt Creator 简介 Qt 是一个跨平台应用程序和 UI 开发框架.使用 Q ...

  2. Qt图形界面编程入门(Qt的历史、Qt安装资源链接、Qt Creator简介)

    Qt的历史渊源 Qt是1991年由挪威的奇趣科技(Trolltech)公司开发的跨平台C++图形用户界面(GUI)用程序开发框架,2008年,奇趣科技公司被诺基亚公可收购,Qt也因此成为诺基亚公司旗下 ...

  3. QT的简介以及安装流程

    目录 一.QT的简介 1.简介 2.Qt 的作用 二.Qt的安装 三.如何创建项目并将其发布 1.创建项目 2.发布项目 一.QT的简介 1.简介 Qt(官方发音 [kju:t],音同 cute)是一 ...

  4. 【Qt】Qt数据库简介

    00. 目录 文章目录 00. 目录 01. Qt SQL模块简介 02. 数据库类 03. 数据库驱动 04. 测试代码 05. 附录 01. Qt SQL模块简介 本概述假定您至少具有SQL的基本 ...

  5. Qt QObject::connect: Parentheses expected错误原因

    Qt 运行提示 QObject::connect: Parentheses expected, signal QUdpSocket::readyRead in -\terminal\net103.cp ...

  6. QT:QObject 简单介绍

    QObject 是所有Qt对象的基类. QObject 是Qt模块的核心.它的最主要特征是关于对象间无缝通信的机制:信号与槽. 使用connect()建立信号到槽的连接,使用disconnect()销 ...

  7. Hello Qt——QWT简介

    一.QWT简介 QWT,即Qt Widgets for Technical Applications,是一个基于LGPL版权协议的开源项目, 可生成各种统计图,是为具有技术专业背景的程序提供GUI组件 ...

  8. qtcreator 自动进入反汇编_1.2 Qt Creator简介

    俗话说的好,磨刀不误砍柴工,任何一门编程语言或是编程框架,都需要一个强大的IDE,熟练掌握IDE提供的各项功能,往往能达到事半功倍的效果,本节就给大家介绍下强大的Qt Creator的使用方法. 1. ...

  9. 第一章 QT Creator 简介

    2019-9-10 总结<Qt Creator快速入门 第三版> 下载与安装 环境介绍 界面组成:菜单栏.模式选择器(Ctrl+1-6).构建套件选择器.定位器.输出窗格(Alt+1-7) ...

最新文章

  1. “接口”的定义及其与“抽象类”的区别
  2. sharepoint 2010学习资源汇总
  3. mysql memcached 使用场景_memcache 应用场景
  4. JavaEE开发之SpringMVC中的自定义拦截器及异常处理
  5. 模仿Bootstrap插件的放大镜插件
  6. java oracle 换行,oracle中Clob字段中的回车换行在jsp中展示的问题
  7. NYOJ 61:传纸条(一)(三维DP)
  8. ASIHTTPRequest報錯解決辦法
  9. STL源码剖析heap
  10. c语言数组实现冒泡排序
  11. DB9接口定义、232串口公头和母头的引脚定义接法
  12. Linux重新挂载磁盘,如何把磁盘挂载到已有目录上面
  13. java.lang.IllegalArgumentException异常
  14. linux 个人云存储_您的私人云管家 联想个人云存储上手体验
  15. matlab的spm,医学图像的批量配准(Matlab,SPM),医学影像,matlabSPM
  16. 游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64
  17. 微信和支付宝APP支付使用总结
  18. MTK6572平台lcd背光配置、调试
  19. mysql的in和exist的区别
  20. C++面向对象程序设计(第二版)

热门文章

  1. Outlook邮件撤回有时间限制吗_怎么操作?
  2. MATLAB和Python求解非线性常微分方程
  3. Xilinx的智能门控时钟技术你了解吗?
  4. sql server如何直接在表中修改数据
  5. Xshell6安装与使用
  6. 淘宝商品详情接口抓取
  7. 英文文档翻译软件-汉语文章翻译成英语
  8. 戴尔计算机专业推荐笔记本电脑,戴尔笔记本推荐
  9. VSPD+XCOM+Proteus仿真stm32串口通信
  10. 苹果CMS海螺模板V16魔改版2.0修复bug分享给大家