QObject类是Qt对象模型的核心类,也是所有Qt所有类对象的基类。继承QObject,我们可以使用其相应的功能,包括熟悉的信号与槽机制,接收事件,一些计时器,翻译等。
-
所有QObject会被记录在一个全局的对象树中,当以某个对象作为父对象建立子对象时,该子对象会自动存进父对象的孩子列表中,也会在对象树中作为父对象的叶子。当父对象析构时,其孩子列表中的子对象也会依次析构。当然子对象也可以单独析构。构造过程应是由上至下,而析构则相反。
-
我们将QObject对象视为ID,即QObject::objectName()是唯一的,所以QObject不允许拷贝构造函数和赋值运算符,或是直接将对象塞到一些容器里面。因为上述操作会面临一些问题:
(1)副本对象名如何确定
(2)对象树中在何处安放副本
(3)信号槽等如何转移至副本
(4)副本是否包含新增加的属性
所以以下操作均不合法
QObject test;
QObject test2(test);//拷贝构造函数
QObject test1;
test1 = test;
故应该传递的是对象指针,而不是对象本身。
-
当一个元对象被删除时,它会发出destroyed()这个信号,开发者可以通过捕抓这个信号来防止悬挂引用。
-
QObject具有线程亲和性,即类对象接受信号或事件时,相应的槽函数或处理函数也是在这个对象的同一个线程中运行。故当我们把QObject对象转移(moveToThread())到其他线程时,原来的信号就无法传送至该对象,槽函数也无法执行。
(1)QObject子对象必须和父对象在同一个线程中。当移动一个QObject对象至其他线程,其所有的子对象也会跟着转移过去。
(2)当两个QObject位于不同线程,它们不可以使用setParent()来建立父子对象。
(3)QObject对象拥有父对象时,不可单独调用moveToThread()。
(4)在 QThread::run() 中创建的 QObject 对象不能成为 QThread 对象的子对象,因为 QThread 不存在于 QThread::run() 中的线程。