注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

Qt下 帽式Tab的 TabWidget  

2017-06-08 03:09:42|  分类: QT5.x与QML |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
如图:
Qt下 帽式Tab的 TabWidget - 漠雨 - 沙漠里de烟雨__风尘无名
 
 关键代码:
#include <QPainter>
#include <QProxyStyle>
#include <QStyleHintReturn>

class CustomTabStyle : public QProxyStyle
{
public:
    QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const
    {
        QSize sz = QProxyStyle::sizeFromContents(type,option,size,widget);
        if(type == QStyle::CT_TabBarTab)
        {
            int rw = sz.width();
            sz.transpose();
            sz.rwidth() = rw + 10;
            sz.rheight() = TabBarHeight;
        }
        return sz;
    }

    void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const
    {
        if(element == CE_TabBarTabLabel)
        {
            if(const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option))
            {
                QRect rect = tab->rect;

                int top_gap = 2;
                int top_radius = 5;
                int bottom_gap = 6; //==bottom_radius;

                if(tab->state & QStyle::State_Selected) //clicked or double clicked;
                {
                    painter->setPen(Qt::black);
                    painter->setBrush(QBrush(Qt::gray));

                    QPainterPath path;

                    int x0 = rect.x();
                    int y0 = rect.y()+rect.height();
                    path.moveTo(x0,y0);

                    x0 = rect.x()-bottom_gap;
                    y0 = rect.y()+rect.height()-2*bottom_gap;
                    path.arcTo(x0,y0,2*bottom_gap,2*bottom_gap,270,90);  //270指当前所在角度,90指逆时针转90度,若为负,则为顺时针;

                    x0 += 2*bottom_gap;
                    y0 = rect.y()+top_gap+top_radius;
                    path.lineTo(x0,y0);

                    y0 = rect.y()+top_gap;
                    path.arcTo(x0,y0,2*top_radius,2*top_radius,180,-90);

                    x0 += top_radius;
                  //  path.moveTo(x0,y0);
                    x0 = rect.x()+rect.width()-bottom_gap-top_radius;
                    path.lineTo(x0,y0);

                    x0 -= top_radius;
                    path.arcTo(x0,y0,2*top_radius,2*top_radius,90,-90);

                    x0 += 2*top_radius;
                    y0 += top_radius;
                  //  path.moveTo(x0,y0);
                    y0 = rect.y()+rect.height()-bottom_gap;
                    path.lineTo(x0,y0);

                    y0 -= bottom_gap;
                    path.arcTo(x0,y0,2*bottom_gap,2*bottom_gap,180,90);

                 //   path.moveTo(rect.x()+rect.width(),rect.y()+rect.height());
                    path.lineTo(rect.x(),rect.y()+rect.height());

                    painter->drawPath(path);
                }
                else if(tab->state & QStyle::State_MouseOver) //mouse hovered;
                {
                    painter->setPen(Qt::black);

                    int x0 = rect.x()+bottom_gap;
                    int y0 = rect.y()+rect.height();
                    int x1 = x0;
                    int y1 = rect.y()+top_gap;
                    painter->drawLine(x0,y0,x1,y1);
                    x0 = x1;
                    y0 = y1;
                    x1 = rect.x()+rect.width()-bottom_gap;
                    painter->drawLine(x0,y0,x1,y1);
                    x0 = x1;
                    y0 = y1;
                    y1 = rect.y()+rect.height();
                    painter->drawLine(x0,y0,x1,y1);
                }

                QTextOption option;
                option.setAlignment(Qt::AlignCenter);
                painter->drawText(rect, tab->text,option);

                return ;
            }
        }

        if(element == CE_TabBarTab)
        {
//      //      painter->setBackground(QBrush(Qt::gray));
//            painter->setBrush(Qt::gray);
//            painter->drawRect(widget->rect());

            QProxyStyle::drawControl(element,option,painter,widget);
        }

    }
};

然后:
tabWidget->tabBar()->setStyle(new CustomTabStyle); //tabWidget为QTabWidget的对象;
  评论这张
 
阅读(26)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017