QObject简单介绍
QObject是QT框架的核心,在该对象内可以使用QT框架的信号和槽机制。

一个QObject对象创建在另一个QObject类(该类可以称作父类)中,该对象将自动将其自身添加到父对象的孩子列表中。父类拥有对所有子QObject对象的控制权,可以自动在析构函数中删除所有的子对象。

需要使用信号和槽机制的QObject对象,必须在声明类中加入Q_OBJECT宏,该机制依赖于元对象编译器(MOC)。不管有没有用到信号和槽机制,最好都加上该宏,避免出现一些奇怪的问题。

线程关联性
QObject实例对象具有线程的关联性,也就是该实例对象处于某一个线程中。当实例对象接收到排队的信号和发布的事件时,插槽或者事件处理程序将在该对象所在的线程中运行。

注意: 如果实例对象不处于某一个线程中或者处于在没有运行事件循环的线程中,该对象将无法接受排队的信号和事件。

默认情况下,QObject位于创建它的线程中。可以使用thread()函数查询当前所在的线程,还可以使用moveToThread()更改对象的线程关联。

注意:所有的QObject对象实例一定是与他们的父对象处在同一个线程中
如果两个QObjec实例对象处在不同的线程中,调用setParent()函数将父对象指定为另一方会发生错误。

当一个QObject实例对象被移动到另一个线程时,它的所有子线程也会被自动移动。

如果QObject实例对象已经处在一个父对象中,调用maveToThread()将发生失败。

如果QObject是在QThread::run()被创建,则该对象不能成为QThread实例对象的子对象,因为QThread实例对象并不处在调用QThread::run()的线程中。

两种常用的信号和槽的连接方法

指定发送对象,接收对象,发送信号函数,接收信号处理的槽函数以及可选择连接类型。函数原型:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

其中连接类型说明如下:

枚举值 数值 说明
Qt::AutoConnection 0 默认值。如果接收对象和触发信号的对象处于同一线程中,则选择直连的方式;否则,使用队列进行连接。
Qt::DirectConnection 1 发出信号后立即调用槽函数。该槽函数位于信号所处的线程中。
Qt::QueuedConnection 2 当控制权返回到接收者线程的事件循环时,将调用该插槽。 该插槽在接收者的线程中执行。
Qt::BlockingQueuedConnection 3 与Qt :: QueuedConnection相同,但是发送信号的线程被挂起,直到槽函数执行完成再恢复线程。 如果接收器位于发送信号的线程中,则不得使用此连接,否则应用程序将死锁。
Qt::UniqueConnection 0x80 可以使用按位OR来与上述任何一种连接类型组合。 设置Qt :: UniqueConnection时,如果连接已经存在(即,如果相同信号已经连接到同一对对象的同一插槽),则QObject :: connect()将失败。

示例

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)));

指定发送对象,接收对象,信号函数成员,槽函数成员以及可选信号类型。函数原型:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

示例

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged, label, &QLabel::setText);

可以调用disconnect()函数使信号和槽连接失效。

QT学习总结之QObject详解相关推荐

  1. QT学习总结之QWidget详解

    1.说明 QWidget类是所有用户界面对象的基类. QWidget是用户界面的原子类.它接收鼠标.键盘和来自系统的其他事件,并在屏幕上将它们绘制出来.每个Widget都是矩形的,并按照Z-order ...

  2. Qt学习总结之QPushbutton详解

    一.简述 按钮,界面中常用的控件,默认矩形. QPushButton的子类:QCommandLinkButton 父类:QAbstractButton.QAbstractButton的父类是QWidg ...

  3. PyQt5学习笔记——一文详解QObject

    QObject详解笔记1 一.简介 QObject是所有Qt对象的基类 二.功能作用 2.1 对象名称.属性 2.1.1 API setObjectName("唯一名称") 给QT ...

  4. 学习QT之信号槽机制详解

    学习QT之信号槽机制详解 一.Qt信号槽机制 概念:信号槽是Qt框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如:按钮检测到自己被点击了一下,它就会发出一个信号(sig ...

  5. Qt QListWidget列表框用法详解

    Qt QListWidget列表框用法详解 很多应用程序中需要以列表的形式向用户展示数据(资源),比如 Windows 操作系统会以列表的方式展示很多张桌面背景图(如图 1a) 所示),再比如很多音乐 ...

  6. java多线程学习-java.util.concurrent详解

    http://janeky.iteye.com/category/124727 java多线程学习-java.util.concurrent详解(一) Latch/Barrier 博客分类: java ...

  7. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  8. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

  9. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

最新文章

  1. MySQL jfinal 生成数据_JFinal Web开发学习(四)数据库连接与自动生成model
  2. [No0000C0]百度网盘真实地址解析(不用下载百度网盘)20170301
  3. LeetCode 153. Find Minimum in Rotated Sorted Array (在旋转有序数组中找到最小值)
  4. Spicy Spring:动态创建自己的BeanDefinition
  5. leetcode 137. 只出现一次的数字 II(位运算)
  6. 怎么抓取屏幕截图计算机考试时间,定时抓屏快照(电脑截屏工具)V4.8 最新版
  7. HTML+CSS+JS实现love520爱心表白
  8. Python快速计算Fibonacci数列中第n项的方法
  9. java里类包含对象对不对_Java类中的对象
  10. JavaScript语言精粹 ——笔记
  11. Spring 框架RCE 安全漏洞及解决方式
  12. Windows Server 2016-抢占FSMO角色
  13. Java 杨辉三角形
  14. Python与R语言优缺点比较——“术业有专攻”
  15. linux 批量更改三四级目录 扩展名,Linux批量更改文件后缀名
  16. HashMap原理详解:探测技术(Probing)、数据聚集(Clustering)、寻址方式(Addressing)、墓碑删除(tombstones)等技术的深度剖析
  17. CF1313 C2. Skyscrapers (hard version)
  18. C语言2--进制和运算符
  19. 好听的歌曲单片机c语言程序,单片机C语言程序举例(三)
  20. Field ‘xxx‘ doesn‘t have a default value

热门文章

  1. html中根据姓名模糊查询,JavaScript根据Json数据来做的模糊查询功能
  2. RCP程序打包导出时乱码问题String literal is not properly closed by a double-quote
  3. Spring clound+VUE+WebSocket实现消息推送 一(即时通讯)
  4. tim trgo 的使用方法
  5. 微信小程序头部自定义搜索框斗鱼等
  6. Ubuntu下Hadoop以及Spark配置
  7. java怎么保留一位小数_java四舍五入保留一位小数代码要怎么编写?
  8. 活动目录:域控制器策略大全
  9. 【SCL】博图scl语言应用项目:装配流水线模拟控制
  10. java koala_Koala应用程序:用于现代Web开发的跨平台应用程序