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. str字符串 encoding( ) 方法
  2. Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”
  3. java c c 的应用_javac 简单应用
  4. PyQt5 笔记1 -- 环境配置
  5. c语言修改windows系统时间,c语言实现系统时间校正工具代码分享
  6. 自行车房车,还是第一次看到,惊倒一片!
  7. Lotus,协作领域的常青树
  8. 哈苏相机加持!一加9 Pro海外抢先发布:采用120Hz LTPO屏幕
  9. tensorflow-reverse(反向传播)
  10. 枚举Enumerations
  11. 打开你的脑洞:NER如何进行数据增强 ?
  12. sql2005没有服务器名称
  13. 运维工程师面试题及答案(网络运维工程师面试题)
  14. 关注公众号回复图片php,公众号被关注回复可以回复文字加图片消息吗? | 微信公众号指南...
  15. 【解决办法】ES文件浏览器无法播放该链接
  16. 周易六十四卦——乾卦
  17. 給windowsXP穿上Linux Ubuntu的漂亮馬甲
  18. android x86 5.1 微信,微信5.1终于来了!微信5.1安卓版正式发布
  19. CUBEMX STM32F105RB U盘读写详细教程
  20. 大数据 Linux 搭建(一)

热门文章

  1. python里面如何实现元组和列表的转换_python列表和元组相互转换
  2. Bitnami redmine 一键安装包
  3. 底层啊底层,你究竟是什么?
  4. disruptor源码阅读与分析---RingBuffer与Sequence
  5. oracle创建列默认值,表列添加默认值的方法
  6. 干货 | 带你解锁AC/DC、DC/DC转换器基础
  7. 2884: 水果分级
  8. 一步一步带你爬天猫,获取杜蕾斯评论数据
  9. 《数据结构》C语言版(严蔚敏)——绪论(一)
  10. python networkx 边权重_networkx(Python)中基于边权重排序的相邻边