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

 

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:

#ifndef MYTABBAR_H
#define MYTABBAR_H

#include <QtWidgets>

#define COLOR_HOVER         "#CDC9C9"
#define COLOR_SELECT_0      "#4F94CD"
#define COLOR_SELECT_1      "#EEB422"
#define COLOR_NORMAL_0      "#63B8FF"
#define COLOR_NORMAL_1      "#FFFF00"
#define COLOR_MARK          "#FF3333"

class MyTabBar : public QTabBar
{
    Q_OBJECT
public:
    explicit MyTabBar(QWidget *parent = 0);


protected:
    QSize tabSizeHint(int index) const;
    void paintEvent(QPaintEvent *event);

};

#endif // MYTABBAR_H

MyTabBar.cpp:

#include "mytabbar.h"
#include <QPainter>

MyTabBar::MyTabBar(QWidget *parent) : QTabBar(parent)
{

}

QSize MyTabBar::tabSizeHint(int index) const
{
    return QSize(200,50);
}

void MyTabBar::paintEvent(QPaintEvent *event)
{
//    QTabBar::paintEvent(event);

    QPainter p(this);
    for(int i = 0 ; i < count(); i++)
    {
        QRect rc = tabRect(i);

        QStyleOptionTabV2 option;
        initStyleOption(&option, i);

        //tab背景
        p.setPen(Qt::NoPen);
        if(QStyle::State_MouseOver & option.state)
        {
            p.setBrush(QColor(COLOR_HOVER));

        }
        else if(QStyle::State_Selected & option.state)
        {
            if(i == 0)
            {
                p.setBrush(QColor(COLOR_SELECT_0));
            }
            else if(i == 1)
            {
                p.setBrush(QColor(COLOR_SELECT_1));
            }
        }
        else
        {
            if(i == 0)
            {
                p.setBrush(QColor(COLOR_NORMAL_0));
            }
            else if(i == 1)
            {
                p.setBrush(QColor(COLOR_NORMAL_1));
            }
        }
        p.drawRect(rc);

        //tab文字
        p.setPen(Qt::black);
        p.setBrush(Qt::NoBrush);
        p.drawText(rc,Qt::AlignCenter,tabText(i));

        //红色角标
        if(i == 1)
        {
            QRect rect(0,0,30,30);
            rect.moveTopRight(rc.topRight());

            p.setPen(Qt::NoPen);
            p.setBrush(QColor(COLOR_MARK));
            p.drawEllipse(rect);

            p.setPen(QColor(Qt::white));
            p.drawText(rect, Qt::AlignCenter, "99");
        }
    }

}

MyTabWidget.h:
#ifndef MYTABWIDGET_H
#define MYTABWIDGET_H

#include <QTabWidget>
#include "mytabbar.h"


class MyTabWidget : public QTabWidget
{
    Q_OBJECT
public:
    explicit MyTabWidget(QWidget *parent = 0);

};

#endif // MYTABWIDGET_H

MyTabWidget.cpp:

#include "mytabwidget.h"

MyTabWidget::MyTabWidget(QWidget *parent)
{
    setTabBar(new MyTabBar(this));
}

 

5,源码下载

 

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

 

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

群号码:1149411109

群名称:Qt实战派学习群

在这里插入图片描述

 

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逆枫゛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值