记录一下Qt的宏

Macro

#define  定义某个宏
\ 延伸下一行
## 连接两个字符

当前分页 大多都是 d_ptr q_ptr 相关

两个基础的模板

template <typename T> static inline T *qGetPtrHelper(T *ptr) { return ptr; }
template <typename Wrapper> static inline typename Wrapper::pointer qGetPtrHelper(const Wrapper &p) { return p.data(); }

Q_DECLARE_PRIVATE

  • 提供了一组 d_func() 函数,这样 不管是 const 对象 还是非const对象 都可以使用
  • 这个一般在 API类中 使用, 这样构成了 class -> private class 的使用关系
#define Q_DECLARE_PRIVATE(Class) \
    inline Class##Private* d_func() { return reinterpret_cast<Class##Private * >(qGetPtrHelper(d_ptr)); } \
    inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private * >(qGetPtrHelper(d_ptr)); } \
    friend class Class##Private;
展开示例
Q_DECLARE_PRIVATE(QListView)
//-->  展开成:
// d_ptr 在QObject中: QScopedPointer<QObjectData> d_ptr;
inline QListViewPrivate* d_func() {
  return reinterpret_cast<QListViewPrivate* > qGetPtrHelper(d_ptr);
}

inline const QListViewPrivate* d_func() const {
  return reinterpret_cast<QListViewPrivate* > qGetPtrHelper(d_ptr);
}

friend class QListViewPrivate;

Q_DECLARE_PRIVATE_D

#define Q_DECLARE_PRIVATE_D(Dptr, Class) \
    inline Class##Private* d_func() { return reinterpret_cast<Class##Private * >(Dptr); } \
    inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private * >(Dptr); } \
    friend class Class##Private;

Q_DECLARE_PUBLIC

  • 和上面的一样
  • 不同的是,这个在 private class 中使用, 构成了private class --> class 的使用关系
#define #define Q_DECLARE_PUBLIC(Class)      \
    inline Class* q_func() { return static_cast<Class * >(q_ptr); } \
    inline const Class* q_func() const { return static_cast<const Class * >(q_ptr); } \
    friend class Class;
展开示例
Q_DECLARE_PUBLIC(QListView)
//-->  展开成:
//QObjectData 中有 q_ptr: QObject * q_ptr;
inline QListView* q_func() {
  return static_cast<QListView* >(q_ptr);
}

inline const QListView* q_func() const{
  return static_cast<QListView* >(q_ptr);
}

friend class QListView;

Q_D

简化使用 d_ptr

#define Q_D(Class) Class##Private * const d = d_func()

Q_Q

#define Q_Q(Class) Class * const q = q_func()
简化使用 q_ptr

Q_ENUM

Q_PROPERTY

QT_REQUIRE_CONFIG

/*
    The QT_CONFIG macro implements a safe compile time check for features of Qt.
    Features can be in three states:
        0 or undefined: This will lead to a compile error when testing for it
        -1: The feature is not available
        1: The feature is available
*/
#define QT_CONFIG(feature) (1/QT_FEATURE_##feature == 1)
#define QT_REQUIRE_CONFIG(feature) Q_STATIC_ASSERT_X(QT_FEATURE_##feature == 1, "Required feature " #feature " for file " __FILE__ " not available.")

QT_BEGIN_NAMESPACE

直接可以使用 namespace

# define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
# define QT_END_NAMESPACE }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值