1.元对象系统简介
在Qt的学习中,应该先学习元对象系统再学习信号与槽
因为信号与槽就是元对象系统中的一个功能,如果没有元对象系统的话,那就i用不了信号与槽了
Qt的元对象系统叫做:Meta-Object-System(简称为MOS)
元对象系统是为了Qt能够更好的兼容C++语法以及标准,元对象系统主要包含:
- 元对象
- 动态类型
- 类的属性信息
- 信号与槽
...
2.三大基础条件
元对象系统有三大基础条件:
- 类一定是QObject类的派生类
(也就是说使用的类必须继承[可以是直接继承或者间接继承]QObject类才能使用元对象系统) - 类一定包含Q_OBJECT宏
(主要用来启用元对象功能更,比如:元对象、动态属性、信号与槽) - 元对象编译器Meta-Object-Compiler(moc)
(会生成包含元对象的C++文件,文件以moc开头)
有了moc文件之后,就可以支撑信号与槽,运行时类的信息和动态属性系统的使用
3.元对象类型
元对象的类型是:QMetaObject类,它是元对象系统的核心类之一,包含了类的元信息
例如:类名、父类名、属性、信号与槽...
只要是QObject类的派生类,那么这个类内部都有一个元对象
获取类的元对象,可以获取:
- 获取元对象指针
metaObject() - 获取元对象变量
staticMetaObject
new了一个按钮对象,虽然QPushButton类并不是QObject类的直接派生类
但是是间接派生类所以照样支持元对象系统,所以可以通过metaObject()来获取元对象指针
然后也可以通过staticMetaObject来获取元对象变量
可以通过这两种方式获取类的信息
换句话说元对象就是描述类的一个类型, 比如:类名、判断关系
我们通过元对象的指针,来获取类的属性
相当于元对象在描述这个类
除了访问类名以外,也可以判断继承关系
4.对象树
在Qt中所构建的图形化应用程序会涉及到很多的组件
当在类中定义了组件的指针对象,需要在构造函数中进行实例化(需要调用new方法)
例如:
QPushButton *okBtn = new QPushButton(QString("OK"),this);
优势:当父组件销毁的时候,子组件也会随之销毁
5.常用的宏
1)Q_OBJECT
元对象系统必备的宏
2)Q_CLASSINFO(NAME,Value)
可以指定类的信息的宏(简单来说可以给类加一些信息)
对于整体的元对象系统最主要了解的就是信号与槽
5.总结元对象系统
为每一个QObject类的派生类提供了一个元对象系统
目的:为了更好的兼容C++的语法以及标准,便于GUI开发
条件:
- 类一定是QObject类的派生类
- 类一定包含Q_OBJECT宏
- 元对象编译器(MOC Meta Object Compiler)
只要满足以上两个条件,元对象编译器就会生成moc文件
moc文件中会包含OMetaObject对象
作用:
- [1]获取类的属性\数据
... - [2]支持信号与槽
- [3]对象树
信号与槽:
[1]类中指定信号
在类中以signals:限定
信号就是一个函数声明,并且不需要有实现,也不能实现
[2]发送信号
当应用满足某一个条件,使用关键字emit发送信号
发送信号相当于是函数调用
[3]槽
在类中以public slots:限定
槽函数就是一个普通的函数,可以是成员函数,也可以是全局函数,不光要有声明也要有实现
[4]信号与槽的连接
QObject类中有一个成员函数就是connect()方法,用于连接信号与槽
[5]connect()
信号的发送者对象地址
发送的信号
SIGNAL(信号)
&类::信号
触发信号的接收者(对象指针this)
所触发的槽函数
SLOT(槽函数)
&类::槽函数
当槽函数重载的情况
类型转换指定函数的参数类型
static_cast(槽函数)