qt-声明、宏
前向声明(Forward Declaration):
- 前向声明是指在使用类或者结构体之前声明其存在,但不包含其定义。
- 用于告知编译器该类型的名称和基本信息,以便在编译时能够通过类型检查,但不需要知道该类型的详细定义。
// Forward declaration
class MyClass;
引用头文件(Include Directive):
- 引用头文件是通过
#include
指令将外部文件内容包含到当前文件中。 - 包含头文件时,编译器会将被包含的文件内容完全复制到包含它的文件中。
- 通常用于包含类的定义、函数声明、宏定义等详细信息,使得当前文件能够访问和使用所包含文件中定义的所有内容。
- 引用头文件可能会导致编译时间增加,并且在包含大量内容的情况下,可能会导致编译器生成的中间文件增大。
- 使用前向声明可以减少编译时间和减少编译依赖,特别是在大型项目中。
- 引用头文件则是必须的,当你需要使用类的详细定义或者类的成员函数时。
- 通常情况下,应该优先使用前向声明,尤其是在头文件中声明类时,可以通过前向声明减少头文件的依赖关系,提高编译效率和可维护性。
- 这意味着你不能直接创建
ElaScrollBarPrivate
对象,也不能访问它的成员,但你可以声明指向ElaScrollBarPrivate
对象的指针或引用。、
Q_PROPERTY
Q_PROPERTY(TYPE p##M MEMBER _p##M NOTIFY p##M##Changed)
##
是宏拼接操作符
反斜杠 \
是 C++ 预处理器中的换行符续行符。它用于在宏定义中连接多行代码。使用 \
可以将长的宏定义分成多行,使代码更具可读性。
这个 Q_PROPERTY
声明会被展开成类似以下的代码:
Q_PROPERTY(int pAge MEMBER _pAge NOTIFY pAgeChanged)
这表示 pAge
是一个 int
类型的属性,实际存储该属性值的成员变量是 _pAge
,并且当属性 pAge
发生变化时,会发出 pAgeChanged
信号。
Q_D
- Q_Q 中的
Q
代表公有类(Public Class)。 - Q_D 中的
D
代表私有数据(Private Data)。
Q_D指针的原理是将对象的实现放在单独的类(例如MyClassPrivate)中,然后将Q_D指针作为指向该类的单个成员变量存储在主类中。这意味着只有该类可以访问此指针,并且对象的实现可以轻松地更改而无需更改公共接口。
于Q_D指针需要访问QObject的元信息,因此只能与派生自QObject的类一起使用。
在class中配合使用 Q_DECLARE_PRIVATE 和 Q_D ,方便获取d指针,d指针指向Class##Private;
QScopedPointer
是 Qt 提供的一个智能指针类,用于管理动态分配的对象的生命周期。它类似于标准库中的 std::unique_ptr
,负责对象的自动释放,以防止内存泄漏。
q指针是在私有数据类中使用的,来获取主类对象指针
#include <QScopedPointer>class MyClassPrivate;
class MyClass : public QObject
{Q_OBJECTQ_DECLARE_PRIVATE(MyClass); //myclass 可以访问private的变量和方法
public:explicit MyClass(QObject *parent = nullptr);~MyClass();void fun();
private:QScopedPointer<MyClassPrivate> d_ptr;// 管理私有数据的智能指针//QScopedPointer 确保在 MyClass 的生命周期结束时自动删除 MyClassPrivate 对象,防止内存泄漏。Q_DISABLE_COPY(MyClass);//防止D的d_ptr指针二次释放