动态对象
1.添加Q_PROPERTY对象
#ifndef MYPROPERTYCLASS_H
#define MYPROPERTYCLASS_H
#include <QObject>
class MyPropertyClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString mask READ mask WRITE setMask NOTIFY maskChanged)
public:
explicit MyPropertyClass(QObject *parent = nullptr);
QString mask()const;
void setMask(QString strMaskNum);
signals:
void maskChanged(QString str);
public slots:
private:
QString m_mask;
};
#endif // MYPROPERTYCLASS_H
2.动态属性可以用Q_OBJECT来指向Q_PROPERTY,这样在实际开发中,如果遇到别人写的对象我们又不想了解他的太多内容,只需要知道对象类名就可以直接进行数据的提取。
MyPropertyClass * mypc = new MyPropertyClass;
MyPropertyClass *mypc2 = new MyPropertyClass;
connect(mypc,SIGNAL(maskChanged(QString)),this,SLOT(maskChanged(QString)));
mypc->setMask("10000亿个口罩");
qDebug()<<mypc->mask();
QObject *obj = mypc;
qDebug()<<"obj第一次进行属性的读取:"<<obj->property("mask").toString();
obj->setProperty("mask","20000个口罩");
qDebug()<<"obj第二次进行属性的读取:"<<obj->property("mask").toString();
qDebug()<<"mypc2读取数据:"<<mypc2->mask();
注意因为元对象属性是静态的,内存中只有一份mypc指向了这个内存,意味着mypc2就不能读取到20000个口罩这个数据
对象树
Qt 提供了对象树机制,能够自动、有效的组织和管理继承自 QObject 的 Qt 对象。每个继承自 QObject 类的对象通过它的对象链表(QObjectList)来管理子类对象,当 用 户 创 建 一 个 子 对 象 时 , 其 对 象 链 表 相 应 更 新 子 类 对 象 信 息 , 对 象 链 表 可 通过children()获取。当父对象析构的时候,其对象链表中的所有(子)对象也会被析构,父对象会自动将其从父对象列表中删除。Qt 保证没有对象会被 delete 两次。开发中手动回收资源时建议使用deleteLater 代替 delete,因 deleteLater 多次是安全的,而 delete 多次是不安全的。