小言_互联网的博客

改造QTabWidget的QTabBar,自绘随意控制样式,不同颜色

521人阅读  评论(0)

 

1,简介

 

本文介绍通过自绘,随意定制QTabWidget的 TabBar的方法

可设置不同Tab页的不同背景色、前景色、边框、鼠标三态色、尺寸,以及绘制其他自定义内容(如角标)

 

2,效果

 

 

 

3,主要思路

 

继承QTabBar

改尺寸就是重写 tabSizeHint 函数

改绘制就是重写 paintEvent 函数

 

另外由于QTabWidget 的setTabBar函数为protected, 为了替换 TabBar ,也继承了一份QTabWidget ,在构造函数内替换

因此要注意,demo里 tabWidget 已经在ui设计器内提升成了 MyTabWidget

 

4,主要代码

 

就是写了2个类:MyTabBar、MyTabWidget

这里只为了演示第1页和第2页的区分,代码里写死了。实际使用时,根据需要用变量控制。

 

MyTabBar.h:


  
  1. #ifndef MYTABBAR_H
  2. #define MYTABBAR_H
  3. #include <QtWidgets>
  4. #define COLOR_HOVER "#CDC9C9"
  5. #define COLOR_SELECT_0 "#4F94CD"
  6. #define COLOR_SELECT_1 "#EEB422"
  7. #define COLOR_NORMAL_0 "#63B8FF"
  8. #define COLOR_NORMAL_1 "#FFFF00"
  9. #define COLOR_MARK "#FF3333"
  10. class MyTabBar : public QTabBar
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit MyTabBar(QWidget *parent = 0);
  15. protected:
  16. QSize tabSizeHint(int index) const;
  17. void paintEvent(QPaintEvent *event);
  18. };
  19. #endif // MYTABBAR_H

MyTabBar.cpp:


  
  1. #include "mytabbar.h"
  2. #include <QPainter>
  3. MyTabBar::MyTabBar(QWidget *parent) : QTabBar(parent)
  4. {
  5. }
  6. QSize MyTabBar::tabSizeHint(int index) const
  7. {
  8. return QSize( 200, 50);
  9. }
  10. void MyTabBar::paintEvent(QPaintEvent *event)
  11. {
  12. // QTabBar::paintEvent(event);
  13. QPainter p(this);
  14. for( int i = 0 ; i < count(); i++)
  15. {
  16. QRect rc = tabRect(i);
  17. QStyleOptionTabV2 option;
  18. initStyleOption(&option, i);
  19. //tab背景
  20. p.setPen(Qt::NoPen);
  21. if(QStyle::State_MouseOver & option.state)
  22. {
  23. p.setBrush(QColor(COLOR_HOVER));
  24. }
  25. else if(QStyle::State_Selected & option.state)
  26. {
  27. if(i == 0)
  28. {
  29. p.setBrush(QColor(COLOR_SELECT_0));
  30. }
  31. else if(i == 1)
  32. {
  33. p.setBrush(QColor(COLOR_SELECT_1));
  34. }
  35. }
  36. else
  37. {
  38. if(i == 0)
  39. {
  40. p.setBrush(QColor(COLOR_NORMAL_0));
  41. }
  42. else if(i == 1)
  43. {
  44. p.setBrush(QColor(COLOR_NORMAL_1));
  45. }
  46. }
  47. p.drawRect(rc);
  48. //tab文字
  49. p.setPen(Qt::black);
  50. p.setBrush(Qt::NoBrush);
  51. p.drawText(rc,Qt::AlignCenter,tabText(i));
  52. //红色角标
  53. if(i == 1)
  54. {
  55. QRect rect(0,0,30,30);
  56. rect.moveTopRight(rc.topRight());
  57. p.setPen(Qt::NoPen);
  58. p.setBrush(QColor(COLOR_MARK));
  59. p.drawEllipse(rect);
  60. p.setPen(QColor(Qt::white));
  61. p.drawText(rect, Qt::AlignCenter, "99");
  62. }
  63. }
  64. }
MyTabWidget.h:

  
  1. #ifndef MYTABWIDGET_H
  2. #define MYTABWIDGET_H
  3. #include <QTabWidget>
  4. #include "mytabbar.h"
  5. class MyTabWidget : public QTabWidget
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit MyTabWidget(QWidget *parent = 0);
  10. };
  11. #endif // MYTABWIDGET_H

MyTabWidget.cpp:


  
  1. #include "mytabwidget.h"
  2. MyTabWidget::MyTabWidget(QWidget *parent)
  3. {
  4. setTabBar( new MyTabBar( this));
  5. }

 

5,源码下载

 

链接:https://pan.baidu.com/s/1v3mfwt3ReIoldXWBmzVOBw 
提取码:fo4f 

 

链接不一定永久有效,如果失效可在群文件免费下载:

群号码:1149411109

群名称:Qt实战派学习群

 


转载:https://blog.csdn.net/dpsying/article/details/116230967
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场