Qt学习笔记
Qt核心特点
Qt本身并不是一种编程语言,它实质上是一个跨平台的 ** C++开发类库 。Qt 的元对象编译器(Meta-Object Compiler, MOC)是一个预处理器**。所以在编写Qt类的时候,需要添加一个Q_OBJECT宏,使编译器能够将类中的Qt特性进行处理。
元对象系统
元对象系统提供了对象之间通信的信号与槽机制,运行时类型信息和动态属性系统。
元对象由以下三个基础组成:
- QObject 类是所有使用元对象系统的基类。
- 在一个类的private部分声明Q_OBJECT宏,可以使类使用元对象的特性。
- MOC(元对象编译器)为每一个QObject子类提供必要的代码来实现元对象的系统特性。
元对象还提供了其它功能,例如查询一个类的名称,判断一个对象是否为某一类,或者某一类的子类;设置一个对象的属性等。
qobject_cast()函数可以将QObject类及其子类进行投射。
例如QMyWidget类继承于QWidget类,并在声明中加入了Q_OBJECT宏,那么可以使用下面的语句:
QObject *obj = new QMyWidget;
//变量由QObject 定义,但是实际上指向了QMyWidget类,所以可以使用下面的投射
QWidget *widget = qobject_cast<QWidget *>(obj);
属性系统
Q_PROPERTY()宏可以定义属性,同样也是基于元对象系统实现的。属性的定义在子类的声明中。
属性的定义遵从一定的格式,例如
Q_PROBERTY(bool focus READ hasFocus);//定义了一个属性focus ,并设定读取函数是hasFocus。
但是不管属性的定义中有没有使用READ或WRITE关键字,都可以用QObject::property()读取属性,用QObject::setproperty()设置属性。例如:
QPushButton *button = new QPushButton;
QObject *object = button;
object->setproperty("flat",true);
object->property("flat");
对于一些没有在定义中声明的属性,可以在对象实例化以后,使用QObject::setproperty()将其设定为动态属性,同样可以用QObject::property()获取属性的值。
类的属性系统还可以用宏Q_CLASSINFO()来为元对象设定名称——值信息,并使用classinfo(int),获取某个附加信息。