qt-声明、宏

发布于:2024-08-08 ⋅ 阅读:(247) ⋅ 点赞:(0)

前向声明(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_OBJECT
    Q_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指针二次释放


网站公告

今日签到

点亮在社区的每一天
去签到