• 1960阅读
  • 1回复

QT源码中代码书写方式,还挺有意思 [复制链接]

上一主题 下一主题
离线fpc_diesel
 

只看楼主 倒序阅读 楼主  发表于: 2019-11-22
  1. #switchbutton_p.h(需要在pro文件里面QT += [backcolor=#ffddff]widgets-private,至于为什么,你不加就知道了[/backcolor])
  2. #ifndef SWITCHBUTTON_P_H
  3. #define SWITCHBUTTON_P_H
  4. #include <QObject>
  5. #include "private/qwidget_p.h"
  6. #include "switchbutton.h"
  7. #include "qglobal.h"
  8. class SwitchButtonPrivate  : public QWidgetPrivate
  9. {
  10. public:
  11.     SwitchButtonPrivate();
  12.     void init();
  13.     int m_radius = 8;
  14. };
  15. #endif // SWITCHBUTTON_P_H
switchbutton.h
  1. #ifndef SWICTHBUTTON_H
  2. #define SWICTHBUTTON_H
  3. #include <QWidget>
  4. #include "qglobal.h"
  5. class SwitchButtonPrivate;
  6. class SwitchButton : public QWidget
  7. {
  8.     Q_OBJECT
  9. public:
  10.     SwitchButton(QWidget *parent = nullptr);
  11.     int radius();
  12.     void setRaius(int radius);
  13. private:
  14.     Q_DECLARE_PRIVATE(SwitchButton)
  15. protected:
  16.     virtual void paintEvent(QPaintEvent *event) override;
  17. };
  18. #endif // SWICTHBUTTON_H

switchButton.cpp
  1. #include "switchbutton.h"
  2. #include "switchbutton_p.h"
  3. #include <QPainter>
  4. SwitchButtonPrivate::SwitchButtonPrivate()
  5. {
  6. }
  7. void SwitchButtonPrivate::init()
  8. {
  9.     m_radius = 0;
  10. }
  11. SwitchButton::SwitchButton(QWidget *parent)
  12.     : QWidget(*new SwitchButtonPrivate, parent, 0)
  13. {
  14.     Q_D(SwitchButton);
  15.     d->init();
  16. }
  17. int SwitchButton::radius()
  18. {
  19.     Q_D(SwitchButton);
  20.     return d->m_radius;
  21. }
  22. void SwitchButton::setRaius(int radius)
  23. {
  24.     Q_D(SwitchButton);
  25.     d->m_radius = radius;
  26.     update();
  27. }
  28. void SwitchButton::paintEvent(QPaintEvent *event)
  29. {
  30.     Q_D(SwitchButton);
  31.     QPainter painter(this);
  32.     QPainterPath path;
  33.     path.addRoundedRect(rect(), d->m_radius, d->m_radius);
  34.     painter.setClipPath(path);
  35.     painter.setBrush(Qt::red);
  36.     painter.drawRect(rect());
  37.     return QWidget::paintEvent(event);
  38. }


Q_DECLARE_PRIVATE(SwitchButton)//这里声明了俩函数,代码中就可以使用Q_Q(class),Q_D(class)这两个宏分别去获取其私有类指针和自身指针了,一些隐含的数据统统放到private类中去声明维护,
Tips:如果一个类中属性特别多,而你并不需要别人知道这些,只想暴露给别人一些使用接口,可以采用这种方法,一些简单的类还是算了,还不够麻烦的
离线liudianwu

只看该作者 1楼 发表于: 2019-11-22
这就是所谓的q指针和d指针,说的通俗点就是将私有的变量和方法重新写一个类存储。隐藏用户不需要关心的实现细节。
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个