Это можно назвать шаблоном проектирования, используемым для повышения читабельности заголовочных файлов из заданного класса путем сокрытия всего, о чем пользователь класса не должен знать.
Таким образом, вместо определения файла заголовка из заголовка данного класса, который составлен из открытых и закрытых данных, Qt часто решает поместить частные данные из класса в отдельный класс. Этот отдельный класс затем используется как закрытый член исходного класса.
Например, вместо:
class MyClass
{
public:
MyClass();
~MyClass();
QVariant getValue1();
QVariant getValue2();
QVariant getValue3();
private:
QVariant m_Value1;
QVariant m_Value2;
QVariant m_Value3;
};
У нас может быть следующий
class MyClass
{
public:
MyClass();
~MyClass();
QVariant getValue1();
QVariant getValue2();
QVariant getValue3();
private:
friend class MyClassPrivate;
};
где MyClassPrivate определяется следующим образом
class MyClassPrivate
{
public:
MyClassPrivate ();
~MyClassPrivate ();
QVariant m_Value1;
QVariant m_Value2;
QVariant m_Value3;
};
Другими словами, все члены частного класса, таким образом, «экспортируются» в общедоступное определение частного класса.
Для меня это способ сделать заголовочный файл класса, с которым будет работать пользователь, более читабельным. Это особенно верно, когда речь идет о классах, которым нужно много частных членов.