Qt的源码结构甚是神奇,一堆宏,充分体现高效的设计,将面向对象进行到底。关于封装,本次了解到一个类的稀有成员如何隐藏。先看下普通的一个类,
class CusData:public QObject{
Q_OBJECT
public:
CusData(QObject *parent = nullptr);
~CusData();
void setData(int c, QString s);
// 私有暴露
private:
int count;
QString str;
};
这样仅仅是够用,简单的设计满足的,但是好用,好修改尚未清楚。好在Qt为我们提供了解决方案,如何隐藏私有,涉及的宏如下
// 为该类声明私有成员 // 获取该类的私有成员指针
Q_DECLARE_PRIVATE Q_D
// 为该类声明共有成员 // 获取该类的共有成员指针
Q_DECLARE_PUBLIC Q_Q
下面对该类进行改造,将其私有成员进行封装,并声明class ##Private{};在构造阶段构造私有指针,使用时通过宏Q_D即可获取d_ptr。
// Qt 私有数据封装 class ##Private, ##连字符
class CusDataPrivate;
class CusData:public QObject{
Q_OBJECT
public:
CusData(QObject *parent = nullptr);
~CusData();
void setData(int c, QString s);
void useTest();
protected:
// 私有成员接口通过指针使用
CusDataPrivate *const d_ptr = nullptr;
private:
Q_DECLARE_PRIVATE(CusData);
};
CusData::CusData(QObject *parent)
:QObject(parent),d_ptr(new CusDataPrivate(12, "as", this,parent)){}
CusData::~CusData(){}
void CusData::setData(int c, QString s)
{
// 获取私有成员指针,等效获取d_ptr
Q_D(CusData);
d->setCount(20);
d->setStr("qw");
}
void CusData::useTest()
{
qDebug() << "pri use main";
}
私有成员类,在public下声明公开类,通过外部传入上层公开类初始化,使用时通过宏Q_Q即可获取q_ptr。
class CusData;
class CusDataPrivate:public QObject
{
Q_OBJECT
public:
CusDataPrivate(int c, QString s, CusData *ptr,QObject *parnt = nullptr);
~CusDataPrivate();
int count() const;
QString str() const;
void useParentPtr();
public slots:
void setCount(int count);
void setStr(QString str);
private:
int m_count;
QString m_str;
public:
// 其上层声明
Q_DECLARE_PUBLIC(CusData)
CusData *q_ptr;
};
CusDataPrivate::CusDataPrivate(int c, QString s, CusData *ptr,QObject *parnt)
:QObject(parnt),m_count(c),m_str(s),q_ptr(ptr){}
CusDataPrivate::~CusDataPrivate(){}
int CusDataPrivate::count() const{
return m_count;
}
QString CusDataPrivate::str() const{
return m_str;
}
void CusDataPrivate::useParentPtr(){
// 获取上层共有成员指针
Q_Q(CusData);
q->useTest();
}
void CusDataPrivate::setCount(int count){
m_count = count;
}
void CusDataPrivate::setStr(QString str){
m_str = str;
}