当前位置: 首页 > news >正文

Qt之QObject

简介

QObject是qt中所有对象的基类,也是信号槽的基础

结构

QObject
«Abstract»
QObjectData
QObjectPrivate

QObjectData:作为pimpl的抽象类
QObject中包含实现类的指针

protected:QScopedPointer<QObjectData> d_ptr;

QObjectData中包含指向QObject的指针

public:QObject *q_ptr;

QObject QObjectData相互获取(也就是具体对象指针与具体对象的实现指针)是通过qglobal.h中定义的Q_DECLARE_PRIVATEQ_DECLARE_PUBLIC
Q_DECLARE_PRIVATE在接口类中使用,用于定义获取具体实现类的指针,以及声明实现类为友元

#define Q_DECLARE_PRIVATE(Class) \inline Class##Private* d_func() \{ Q_CAST_IGNORE_ALIGN(return reinterpret_cast<Class##Private *>(qGetPtrHelper(d_ptr));) } \inline const Class##Private* d_func() const \{ Q_CAST_IGNORE_ALIGN(return reinterpret_cast<const Class##Private *>(qGetPtrHelper(d_ptr));) } \friend class Class##Private;

Q_DECLARE_PUBLIC在具体实现类中使用,用于定义获取具体类的指针以及声明接口类为友元

#define Q_DECLARE_PUBLIC(Class)                                    \inline Class* q_func() { return static_cast<Class *>(q_ptr); } \inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \friend class Class;

在连接到成员函数指针时,使用的是模板,其定义在qobjectdefs_impl.h中

信号与槽

QObjectPrivate中有用于信号与槽机制的数据成员

QAtomicPointer<ConnectionData> connections;

ConnectionData结构为

ConnectionData
SignalVector
Connection
Sender
ConnectionOrSignalVector
ConnectionList

Connection

用于表示信号与槽机制中的一个连接

Connection
+ QObject *sender
+ int signal_index
+ QAtomicPointer<QObject> receiver
+ QAtomicPointer<QThreadData> receiverThreadData
+ ushort method_offset
+ ushort method_relative
+ ushort connectionType
+ ushort isSlotObject
+ StaticMetaCallFunction callFunction
+ QtPrivate::QSlotObjectBase *slotObj
+ QAtomicPointer<const int> argumentTypes
+ ushort ownArgumentTypes
+ QAtomicInt ref_
+ QAtomicPointer<Connection> nextConnectionList
+ Connection *prevConnectionList
+ Connection **prev
+ Connection *next

sender:表示信号的发送方
signal_index:表示信号索引
receiver:表示接收方,即处理方
receiverThreadData:表示接收方的所处的线程数据
method_offset,method_relative:用于表示槽函数在槽表的位置偏移
connectionType:表示连接类型,支持的值有0(auto),1(direct),2(queue),4(blocking)
callFunction,slotObj:以共用体形式组织

union {StaticMetaCallFunction callFunction;QtPrivate::QSlotObjectBase *slotObj;};

argumentTypes:表示信号函数的参数列表,类型为int数组
prevConnectionList,nextConnectionList:表示前一个和下一个connection,主要用于发送者关联的连接列表,其为一个单链表
prev,next:用于表示接收者的connection,其中prev为二级指针,next定义在其父类ConnectionOrSignalVector的共用体中

union {// linked list of orphaned connections that need cleaning upConnectionOrSignalVector *nextInOrphanList;// linked list of connections connected to slots in this objectConnection *next;};

ConnectionData

ObjectPrivate中用于表示信号槽连接的数据结构

ConnectionData
+ QAtomicInteger<uint> currentConnectionId
+ QAtomicInt ref
+ QAtomicPointer<SignalVector> signalVector
+ Connection *senders
+ Sender *currentSender
+ QAtomicPointer<Connection> orphaned

signalVector:表示作为发起方,信号发起方关联的连接
senders:表示作为槽方,即接收方关联的connection

线程数据

QObjectPrivate中有表示QObject所属的线程数据,与事件循环有关

public:
QThreadData *threadData;

QObject的构造函数中会初始化threadData

QObject::QObject(QObject *parent): d_ptr(new QObjectPrivate)
{...d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current();d->threadData->ref();.....
}

此时其设置的为主线程QAdoptedThread,禁止调用QAdoptedThreadstart

void QAdoptedThread::run()
{// this function should never be calledqFatal("QAdoptedThread::run(): Internal error, this implementation should never be called.");
}
http://www.lryc.cn/news/468757.html

相关文章:

  • 鸿蒙到底是不是纯血?到底能不能走向世界?
  • 【Android】MVP架构
  • Web服务器之Nginx
  • 【大模型实战篇】大模型分词算法Unigram及代码示例
  • Dockerfile搭建ELK
  • 在合规的地方怎么用EACO地球链兑换交换价值?
  • VS无法安装Win10SDK_10.0.2200,快捷方法
  • github多个账号配置多个SSH秘钥
  • 静态/动态代理详解,一次性看完再也不会搞不清!
  • Webserver(2)GCC
  • mac电脑设置chrome浏览器语言切换为日语英语等不生效问题
  • Python中的人工智能框架与实例
  • 论文阅读(二十六):Dual Attention Network for Scene Segmentation
  • Stack和Queue(3)
  • 怎样把学生的成绩单独告知家长?
  • vue3父组件控制子组件表单验证及获取子组件数值方法
  • 【JavaEE】【多线程】单例模式
  • Java.6--多态-设计模式-抽象父类-抽象方法
  • JAVA Maven 的安装与配置
  • 【程序分享】PCB元件坐标对齐工具 V1.3
  • [bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist
  • 处理Hutool的Http工具上传大文件报OOM
  • transforms的使用
  • python-PyQt项目实战案例:制作一个视频播放器
  • 反向传播的微积分原理 | Chapter 4 | Deep Learning | 3Blue1Brown
  • matlab读取excel表格
  • 基于springboot+vue实现的助学兼职系统(源码+L文+ppt)4-092
  • ⌈ 传知代码 ⌋ 农作物病害分类(Web端实现)
  • CMU生成式人工智能大模型:从入门到放弃(九)
  • HTML基础总结