TabWidget中tabBar文字从左向右显示

在Qt中,当我们使用tabWidget,有时会把tabPosition属性设置成东西朝向的。但这时,我们会发现tabBar中的文字朝向也变了,如下图所示:

而我们总是希望文字是正对着我们的,而不是翻转过后的样子。

 

这里,我们可以通过setStyle来设置widget的风格,而QTabBar是继承自widget的也可以通过同样的方式,设置风格。

setStyle函数的定义为void setStyle(QStyle *style),也就是说我们需要传一个QStyle类型的变量进去。

然后要说一个继承自QStyle的类:QProxyStyle

 

QProxyStyle

QProxyStyle类是一个简便的类,它简化了动态覆盖的QStyle元素。 
QProxyStyle封装了一个QStyle(通常是默认的系统风格),用于动态覆盖绘画或其他特定风格的行为。

(以上为Qt帮助中的说明)

 

接下来,我们需要写一个自定义的继承自QProxyStyle的类,然后作为参数传到setStyle里面。

在这个自定义类中,我们重载QProxyStyle中的函数drawControl()

 

[override virtual] void QProxyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const

用提供的painter绘制给定的element,并使用选项指定的样式选项。

widget参数是可选的,可以用作绘制控件的帮助。 option参数是一个指向QStyleOption对象的指针,可以使用qstyleoption_cast()函数将其转换为正确的子类。

(以上为Qt帮助中的说明)

 

也就是说我们可以在drawControl中进行内容的绘图,可以改变TabBar的样式

 

代码如下(建一个继承于QProxyStyle的类):

class CustomTabStyle:public QProxyStyle
{
public:
    CustomTabStyle(){}


    QSize sizeFromContents(ContentsType type, const QStyleOption *option,
        const QSize &size, const QWidget *widget) const                   //设置Bar上面的内容大小
    {
        QSize s = QProxyStyle::sizeFromContents(type, option, size, widget);
        if (type == QStyle::CT_TabBarTab) {
            s.transpose();
            s.rwidth() = 100;                                     // 设置每个tabBar中item的大小
            s.rheight() = 50;
        }
        return s;
    }

    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 allRect = tab->rect;     //定义一个矩形区域

                if (tab->state & QStyle::State_Selected) {
                    painter->save();
                    painter->setPen(0x89cfff);
                    painter->setBrush(QBrush(0x89cfff));                //蓝色底
                    painter->drawRect(allRect.adjusted(6, 6, -6, -6));
                    painter->restore();
                }
                QTextOption option;
                option.setAlignment(Qt::AlignCenter);     //使文字位置居中
                if (tab->state & QStyle::State_Selected) { //设置文字颜色
                    painter->setPen(0xf8fcff);           //白色字
                }
                else {
                    painter->setPen(0x000001);           //黑色字
                }

                painter->drawText(allRect, tab->text, option);
                return;
            }
        }

        if (element == CE_TabBarTab) {
            QProxyStyle::drawControl(element, option, painter, widget);
        }
    }


};

 然后new一个CustomTabStyle给相应的tabBar:

ui->tabWidget->tabBar()->setStyle(new CustomTabStyle);

效果图:

 

 

转载请标明出处,原文地址:https://blog.csdn.net/come_from_pluto

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值