QObject类

作者: Alliawell | 来源:发表于2019-10-24 17:26 被阅读0次

徐红伟@百香果科技

QObject类是所有Qt对象的基类。是Qt对象模型的基础。

Signals和Slots机制

signals 和 slots是用于对象间通信的。

signal像(但不是)函数指针,更像C#中的事件,槽就是函数。

signal-slot的功能比函数指针更多,比如可以多对一,和一对多的连接。代价是调用速度略慢。

用QObject的 static method:connect()和disconnect()进行信号和槽的连接/解连接。(这解释了为何使用信号-槽的Class中必须加入Q_OBJECT宏)

自动内存管理

QObjects使用object trees进行自我管理,啥子意思呢?

QObject(QObject *parent= nullptr)

QPushButton(QWidget *parent = nullptr)

QChart::QChart(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = ...)

其实QObject在的构造函数里有个parent参数。如果创建是指定了parent参数,对象就会自动添加到parent的children()列表中。此时parent对象就会接管子对象。就是说parent对象销毁的时候,会自动delete所有子对象,不用怕内存泄露。

这就像一棵大树,只要把根砍了(销毁了),会自动销毁它的枝叶。

其他

当QObject对象被销毁时,会发射 destroyed()信号,可以用之来监测信号的生命周期 。

最后,QObject提供一个定时器QTimer,用于定时。

线程亲和性(Thread Affinity)

QObject 具有线程亲和性,即它存在于特定的线程里。当它接收到 queued signals 或 posted events 时,slots 或 event handlers 在 QObject 所在的线程里运行。(QObject 对象的 slot成员函数在其被创建的线程里运行,而不是发射信号的线程了)。

注意:如果QObject 没有亲和的线程(即 thread() 函数返回 0),则它所在的线程没有运行事件循环,因此它就无法接收到 queued signals或posted events.

默认情况下,QObject生存在创建它的线程下。可以用 thread() 函数查看它所在线程,也可以用 moveToThread()改变所在线程。

所有的 QObjects 都必须和其parent在同一个线程里,因此:

1.  如果两个QObject在不同的线程里,则不能用setParent() 建立父子关系。

2. 当 QObject 移动到另一个线程里后,其所有子对象也自动移动到相同线程。

3.如果QObject有父对象,则对其进行moveToThread()时会失败。

4.如果QObject在 QThread::run()中创建,则它不能成为QThread的子对象,因为QThread不在QThread::run()线程里。

注意:QObject的成员变量不会自动成为其子对象。只有现实调用setParent()或再子对象的构造函数里指定父对象,才能建立父子关系。因此把QObject移动到一个线程时,他的成员变量(非子对象)不会移动。

无拷贝构造函数和=操作

在设计QObject时,特定取消了其拷贝构造函数和=操作。

所在在传递QObjet及其子对象时,要传递指针。在容器类中,也只能存储其指针。


c参考Qt官方文档:“QObejct”

相关文章

  • QObject类

    徐红伟@百香果科技 QObject类是所有Qt对象的基类。是Qt对象模型的基础。 Signals和Slots机制 ...

  • QT5编程系列 (1)Q_OBJECT

    只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObjec...

  • PyQt5编程(32):在窗口中布局组—QToolBox类

    QTabWidget类的继承层次结构如下:(QObject, QPaintDevice) - QWidget - ...

  • Qt黑科技

    不能继承于QObject的类就一定不能使用信号槽? 首先不能继承QObject的情况在开发中遇到得并不多,笔者在一...

  • QObject源码解析

    QObject是Qt的基类 QObject的大小是8,除了虚函数表指针需要的4个字节以外,另外的4个字节是QSco...

  • QML调用C++代码

    1. 首先编写好C++类 #include class Cpp : public QObject{ Q_OBJ...

  • QML Book 第十五章 Qt 和 C++ 2

    15.4 普通 Qt 课程 QObject 类构成了 Qt 的基础,但框架中还有更多的类。在我们继续关注 QML ...

  • PyQt(三) 类继承结构图

    一. PyQt5 类的继承结构图 二. 如何获取一个类的父类和子类? 使用QObject.mro()获取父类, 使...

  • PyQt5编程(12):阻止和删除信号的处理程序

    QObject类r的下列函数提供了阻止、删除信号处理程序的方法: blockSignals () - 如果Flag...

  • Qobject

    学习说明 Qobejct 这个类基本是所有控件的基类,所以先学习该控件的操作和对应的api,则在后续学习中就可以使...

网友评论

    本文标题:QObject类

    本文链接:https://www.haomeiwen.com/subject/jmxnuctx.html