2-1moc和QObject

moc和QObject

元对象系统(meta-object-system)

Qt对标准C++进行了扩展,引入了一些新的概念和功能

  • QObject类是所有使用元对象系统的类的基类

  • QObject派生的类在类的private部分声明Q_OBJEDT宏

    • MOC才能识别并进行预处理
    • 可以不用,同样能进行自动的内存管理,但最好使用
  • MOC为每个QObject的子类提供必要的代码

MOC(元对象编译器)是一个预处理器,将Qt的特性程序转换为标准C程序,再进行C的编译

注意

  • QObject不支持拷贝

    • 在基类中,将拷贝构造函数和赋值运算符重载函数设置为私有,并使用了Q_DISABLE_COPY()的宏
  • QObject对象以树结构组织自己

    • 当以另一个对象作为父对象创建QObject(即将基类初始化为该对象),这个对象会自动将自身添加到父对象的子对象列表中
    • 父对象删除时,子对象自动被删除
    • 可以使用findChild()和findChildren()按名称和可选类型查找对象
#include<QCoreApplication>

class A : public QObject
{
public:
A(QObject* parent = nullptr);
~A(){qDebug()<<this<<"被销毁"; };
};

A::A(QObject* parent) : QObject(parent) //父对象
{
qDebug()<<this<<"被构造";
}

int main(int argc, char* argv[])
{
A objA;
A* objA2 = new A(&objA); //objA2是objA的子对象
qDebug()<<"objA2"<<objA2;
return 0; //程序结束,两个对象同时被销毁(父节点被回收,子节点再被回收)
}