找回密码
 立即注册
收起左侧

Qt编写自定义控件47-面板区域控件

0
回复
4245
查看
[复制链接]
累计签到:7 天
连续签到:1 天
来源: 2019-8-10 10:46:56 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一、前言
在很多web网页上,经常可以看到一个设备对应一个面板,或者某种同等类型的信息全部放在一个面板上,该面板还可以拖来拖去的,这个控件首次用在智能访客管理平台中,比如身份证信息一个面板,访客信息一个面板,被访人信息一个面板,这样相当于分类展示了,还提供了对应的标题栏有文字显示,这个控件的使用场景也是非常多,还有个子标题可以设置,拓展了报警闪烁的接口。


二、实现的功能
* 1:支持所有widget子类对象,自动产生滚动条
* 2:支持自动拉伸自动填充
* 3:提供接口获取容器内的所有对象的指针
* 4:可设置是否自动拉伸宽度高度
* 5:可设置设备面板之间的间距和边距


三、效果图



四、头文件代码
  1. #ifndef PANELWIDGET_H
  2. #define PANELWIDGET_H

  3. /**
  4. * 面板容器控件 作者:feiyangqingyun(QQ:517216493) 2016-11-20
  5. * 1:支持所有widget子类对象,自动产生滚动条
  6. * 2:支持自动拉伸自动填充
  7. * 3:提供接口获取容器内的所有对象的指针
  8. * 4:可设置是否自动拉伸宽度高度
  9. * 5:可设置设备面板之间的间距和边距
  10. */

  11. #include <QWidget>

  12. class QScrollArea;
  13. class QFrame;
  14. class QVBoxLayout;
  15. class QGridLayout;

  16. #ifdef quc
  17. #if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
  18. #include <QtDesigner/QDesignerExportWidget>
  19. #else
  20. #include <QtUiPlugin/QDesignerExportWidget>
  21. #endif

  22. class QDESIGNER_WIDGET_EXPORT PanelWidget : public QWidget
  23. #else
  24. class PanelWidget : public QWidget
  25. #endif

  26. {
  27.     Q_OBJECT
  28.     Q_PROPERTY(int margin READ getMargin WRITE setMargin)
  29.     Q_PROPERTY(int space READ getSpace WRITE setSpace)
  30.     Q_PROPERTY(bool autoWidth READ getAutoWidth WRITE setAutoWidth)
  31.     Q_PROPERTY(bool autoHeight READ getAutoHeight WRITE setAutoHeight)

  32. public:
  33.     explicit PanelWidget(QWidget *parent = 0);

  34. protected:
  35.     void resizeEvent(QResizeEvent *);

  36. private:
  37.     QScrollArea *scrollArea;            //滚动区域
  38.     QWidget *scrollAreaWidgetContents;  //滚动区域载体
  39.     QFrame *frame;                      //放置设备的框架,自动变宽变高
  40.     QVBoxLayout *verticalLayout;        //设备面板总布局
  41.     QGridLayout *gridLayout;            //设备表格布局

  42.     int margin;                         //边距
  43.     int space;                          //设备之间的间隔
  44.     bool autoWidth;                     //宽度自动拉伸
  45.     bool autoHeight;                    //高度自动拉伸

  46.     QList<QWidget *> widgets;           //设备面板对象集合
  47.     int columnCount;                    //面板列数

  48. public:
  49.     QSize sizeHint()                const;
  50.     QSize minimumSizeHint()         const;

  51.     int getMargin()                 const;
  52.     int getSpace()                  const;
  53.     bool getAutoWidth()             const;
  54.     bool getAutoHeight()            const;

  55.     QList<QWidget *> getWidgets();
  56.     int getColumnCount();

  57. public Q_SLOTS:
  58.     void setWidget(QList<QWidget *> widgets, int columnCount);
  59.     void setMargin(int left, int top, int right, int bottom);
  60.     void setMargin(int margin);
  61.     void setSpace(int space);
  62.     void setAutoWidth(bool autoWidth);
  63.     void setAutoHeight(bool autoHeight);

  64. };

  65. #endif // PANELWIDGET_H
复制代码


五、核心代码
  1. void PanelWidget::setWidget(QList<QWidget *> widgets, int columnCount)
  2. {
  3.     this->widgets = widgets;
  4.     this->columnCount = columnCount;

  5.     int row = 0;
  6.     int column = 0;
  7.     int index = 0;

  8.     //先把之前的所有移除并不可见
  9.     foreach (QWidget *widget, widgets) {
  10.         gridLayout->removeWidget(widget);
  11.         widget->setVisible(false);
  12.     }

  13.     //重新添加到布局中并可见
  14.     foreach (QWidget *widget, widgets) {
  15.         gridLayout->addWidget(widget, row, column);
  16.         widget->setVisible(true);

  17.         column++;
  18.         index++;
  19.         if (index % columnCount == 0) {
  20.             row++;
  21.             column = 0;
  22.         }
  23.     }

  24.     row++;

  25.     //设置右边弹簧
  26.     if (!autoWidth) {
  27.         QSpacerItem *hSpacer = new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum);
  28.         gridLayout->addItem(hSpacer, 0, gridLayout->columnCount());
  29.     }

  30.     //设置底边弹簧
  31.     if (!autoHeight) {
  32.         QSpacerItem *vSpacer = new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding);
  33.         gridLayout->addItem(vSpacer, row, 0);
  34.     }
  35. }

  36. void PanelWidget::setMargin(int left, int top, int right, int bottom)
  37. {
  38.     gridLayout->setContentsMargins(left, top, right, bottom);
  39. }

  40. void PanelWidget::setMargin(int margin)
  41. {
  42.     if (this->margin != margin) {
  43.         setMargin(margin, margin, margin, margin);
  44.     }
  45. }

  46. void PanelWidget::setSpace(int space)
  47. {
  48.     if (this->space != space) {
  49.         gridLayout->setSpacing(space);
  50.     }
  51. }

  52. void PanelWidget::setAutoWidth(bool autoWidth)
  53. {
  54.     if (this->autoWidth != autoWidth) {
  55.         this->autoWidth = autoWidth;
  56.     }
  57. }

  58. void PanelWidget::setAutoHeight(bool autoHeight)
  59. {
  60.     if (this->autoHeight != autoHeight) {
  61.         this->autoHeight = autoHeight;
  62.     }
  63. }
复制代码


六、控件介绍
1. 超过150个精美控件,涵盖了各种仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按钮、滑动选择器、农历等。远超qwt集成的控件数量。
2. 每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码形式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须包含所有的代码。
3. 全部纯Qt编写,QWidget+QPainter绘制,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统比如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt  Creator中,和自带的控件一样使用,大部分效果只要设置几个属性即可,极为方便。
4. 每个控件都有一个对应的单独的包含该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。
5. 每个控件的源代码都有详细中文注释,都按照统一设计规范编写,方便学习自定义控件的编写。
6. 每个控件默认配色和demo对应的配色都非常精美。
7. 超过130个可见控件,6个不可见控件。
8. 部分控件提供多种样式风格选择,多种指示器样式选择。
9. 所有控件自适应窗体拉伸变化。
10.  集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导入导出xml格式。
11. 自带activex控件demo,所有控件可以直接运行在ie浏览器中。
12. 集成fontawesome图形字体+阿里巴巴iconfont收藏的几百个图形字体,享受图形字体带来的乐趣。
13. 所有控件最后生成一个dll动态库文件,可以直接集成到qtcreator中拖曳设计使用。
14. 目前已经有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。

七、SDK下载
- SDK下载链接:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p
- 下载链接中包含了各个版本的动态库文件,所有控件的头文件,使用demo,自定义控件+属性设计器。
- 自定义控件插件开放动态库dll使用(永久免费),无任何后门和限制,请放心使用。
- 目前已提供26个版本的dll,其中包括了qt5.12.3 msvc2017 32+64 mingw 32+64 的。
- 不定期增加控件和完善控件,不定期更新SDK,欢迎各位提出建议,谢谢!
- widget版本(QQ:517216493)qml版本(QQ:373955953)三峰驼(QQ:278969898)。
- 涛哥的知乎专栏 Qt进阶之路 https://zhuanlan.zhihu.com/TaoQt
- 欢迎关注微信公众号【高效程序员】,C++/Python、学习方法、写作技巧、热门技术、职场发展等内容,干货多多,福利多多!
- Qt入门书籍推荐霍亚飞的《Qt Creator快速入门》《Qt5编程入门》,Qt进阶书籍推荐官方的《C++ GUI Qt4编程》。
- 强烈推荐程序员自我修养和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终生!  



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了