Qt:QObject浅析

QObject类是Qt对象模型的核心类,也是所有Qt所有类对象的基类。继承QObject,我们可以使用其相应的功能,包括熟悉的信号与槽机制,接收事件,一些计时器,翻译等。

  1. 所有QObject会被记录在一个全局的对象树中,当以某个对象作为父对象建立子对象时,该子对象会自动存进父对象的孩子列表中,也会在对象树中作为父对象的叶子。当父对象析构时,其孩子列表中的子对象也会依次析构。当然子对象也可以单独析构。构造过程应是由上至下,而析构则相反。
    在这里插入图片描述

  2. 我们将QObject对象视为ID,即QObject::objectName()是唯一的,所以QObject不允许拷贝构造函数和赋值运算符,或是直接将对象塞到一些容器里面。因为上述操作会面临一些问题:
    (1)副本对象名如何确定
    (2)对象树中在何处安放副本
    (3)信号槽等如何转移至副本
    (4)副本是否包含新增加的属性

所以以下操作均不合法

QObject test;
QObject test2(test);//拷贝构造函数

QObject test1;
test1 = test;

故应该传递的是对象指针,而不是对象本身。

  1. 当一个元对象被删除时,它会发出destroyed()这个信号,开发者可以通过捕抓这个信号来防止悬挂引用

  2. QObject具有线程亲和性,即类对象接受信号或事件时,相应的槽函数或处理函数也是在这个对象的同一个线程中运行。故当我们把QObject对象转移(moveToThread())到其他线程时,原来的信号就无法传送至该对象,槽函数也无法执行。
    (1)QObject子对象必须和父对象在同一个线程中。当移动一个QObject对象至其他线程,其所有的子对象也会跟着转移过去。
    (2)当两个QObject位于不同线程,它们不可以使用setParent()来建立父子对象。
    (3)QObject对象拥有父对象时,不可单独调用moveToThread()。
    (4)在 QThread::run() 中创建的 QObject 对象不能成为 QThread 对象的子对象,因为 QThread 不存在于 QThread::run() 中的线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值