Qt关于tabWidget中tab样式的重绘

Qt关于tabWidget中tab样式的重绘

版本说明

版本作者日期备注
0.1loon2018.12.29初稿

目录

一、需求分析

界面中需要做一个类似下面这样界面的效果:

在这里插入图片描述

在网上找了一下发现这篇文章:https://blog.csdn.net/skyztttt/article/details/52448992

OK,那么可以确定的就是这种效果可以通过QTabWidget来重绘达到类似的效果。只是对于参考文章中的内容部分内容不是很理解,直接套用后发现离我想要的效果还有些远,最终琢磨一段时间后发现要达到根据自己的要求重绘QTabWidget需要先了解Qt 2D绘图的一些基础概念,了解QPainter、QRect、QTextOption、QFont类、画刷和画笔等的作用(这些结合Qt助手和一些Qt教程书籍来学习和了解),以及对OOP中重写的一些了解(这个是语法问题了,暂时不会也不影响你照猫画虎)。

二、最终效果展示

在这里插入图片描述

三、源码详细说明

包含两部分,要重写肯定要有一个重写样式的类,然后tabwidget还要调用这个重写的类渲染样式。

重写类CustomTabStyle,继承自QProxyStyle,感兴趣的可以继续看看最终继承自哪里:

#ifndef CUSTOMTABSTYLE_H
#define CUSTOMTABSTYLE_H

#include <QPainter>
#include <QProxyStyle>


class CustomTabStyle:public QProxyStyle
{
public:
    CustomTabStyle();
    
    QSize sizeFromContents(ContentsType type, const QStyleOption *option,
            const QSize &size, const QWidget *widget) const;
    
    void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const;
};

#endif // CUSTOMTABSTYLE_H
#include "customtabstyle.h"
#include <QStyleOptionTab>

CustomTabStyle::CustomTabStyle()
{
    
}

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

void CustomTabStyle::drawControl(QStyle::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) {  //选中状态:tab的Qlabel为矩形,底色为白色,边框淡灰色,文字为淡蓝色且加粗居中(具体颜色值由拾色器提取)
                painter->save();
                painter->setPen(0xdadbdc);  //设置画笔颜色为淡灰色
                painter->setBrush(QBrush(0xffffff));  //设置画刷为白色
                painter->drawRect(allRect.adjusted(0,0,0,0));  //重绘tab的矩形边框
                painter->restore();  //还原为默认
                
                painter->save();
                painter->setPen(0x006ab1);  //重新设置画笔颜色为淡蓝色
                QTextOption option;
                option.setAlignment(Qt::AlignCenter);  //设置文字居中
                painter->setFont(QFont("", 9, QFont::Bold));  //设置文字样式,大小为9并加粗,颜色由画笔决定
                painter->drawText(allRect, tab->text, option);  //重绘文字
                painter->restore();
            }
            else if(tab->state & QStyle::State_MouseOver) { //hover状态:tab的Qlabel为矩形,底色为灰色,边框仍未淡灰色,文字加粗居中
                painter->save();
                painter->setPen(0xdadbdc);  //设置画笔颜色为淡灰色
                painter->setBrush(QBrush(0xf2f2f2));  //设置画刷为灰色
                painter->drawRect(allRect.adjusted(0,0,0,0));  //重绘tab的矩形边框
                painter->restore();  //还原
                
                painter->save();
                QTextOption option;
                option.setAlignment(Qt::AlignCenter);  //设置文字居中
                painter->setFont(QFont("", 9, QFont::Bold));  //设置文字样式,大小为9并加粗,颜色由画笔决定
                painter->drawText(allRect, tab->text, option);  //重绘文字
                painter->restore();
            }
            else //其它的:tab的Qlabel为矩形,底色为灰色,边框为淡灰色不变,文字不加粗但居中
            {
                painter->save();
                painter->setPen(0xdadbdc);
                painter->setBrush(QBrush(0xf2f2f2));
                painter->drawRect(allRect.adjusted(0,0,0,0));
                painter->restore();
                
                painter->save();
                QTextOption option;
                option.setAlignment(Qt::AlignCenter);
                painter->drawText(allRect, tab->text, option);
                painter->restore();
            }
            
            return;
        }
    }
    
    if (element == CE_TabBarTab) {
        QProxyStyle::drawControl(element, option, painter, widget);
    }
}

调用,包含重写类的头文件然后按如下调用即可:

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

四、最后

控件样式重绘其实就是对基类提供的样式方法进行重写(Overriding ),一般来说,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写,比如这里我们就不想用原来的样式,想自己重绘tabwidget中tab的样式。方法重写又称方法覆盖,这个概念一般是和重载一起出现的,具体更多的内容这里就不展开了。

面向对象编程中经常会遇到重写,它是多态性的一种体现。界面开发中经常会遇到控件样式重绘,因为默认系统自带的控件往往不符合我们的要求,无论是PC界面还是APP界面等的开发基本上都会遇到控件样式重绘,从原理上了解重写以及掌握一些重绘需要使用的类,那么灵活运用重绘就是迟早的事了。

再次感谢:https://blog.csdn.net/skyztttt/article/details/52448992
只有大家共同分享经验,才能让大家更快的进步。

  • 15
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
### 回答1: 在Qt删除Tab页,可以使用QTabWidget的removeTab()函数。该函数需要传入要删除的Tab页的索引值作为参数。例如,如果要删除第二个Tab页,可以使用以下代码: ```cpp ui->tabWidget->removeTab(1); ``` 其,ui->tabWidgetQTabWidget的指针,1表示要删除的Tab页的索引值(从开始计数)。 ### 回答2: Qttabwidget是一个常用的界面控件,其包括多个tab页,用户可以通过点击不同的tab页来切换不同的界面内容。在实际应用,可能会遇到需要删除某个tab页的情况,我们可以通过以下步骤来实现。 1. 获取当前tab页的索引值 在Qt,可以通过currentIndex()函数获取当前选tab页的索引值,代码如下: ```cpp int index = ui->tabWidget->currentIndex(); ``` 2. 删除tab页 通过删除当前索引值所对应的tab页,可以实现删除tab页的功能,Qt提供了removeTab()函数可以实现该功能,代码如下: ```cpp ui->tabWidget->removeTab(index); ``` 3. 修改tab页的名称 如果需要删除tab页后,修改其余tab页的名称,可以通过setTabText()函数来实现,代码如下: ```cpp ui->tabWidget->setTabText(0, "新的标签页1"); ui->tabWidget->setTabText(1, "新的标签页2"); ``` 以上就是Qt删除tab页的基本步骤,需要注意的是,在删除tab页的时候,需要判断当前tab页的数量是否大于1,否则会导致tabwidget失效。同时,在修改tab页的名称时,需要注意新命名后的名称必须唯一。 ### 回答3: QtTabWidget是一种常用的界面设计控件,常用于多页面或多模块的切换展示。有时候需要对TabWidget进行动态调整或修改,其一个要的操作就是在程序运行时删除Tab页。下面我们来讲一下如何在Qt删除Tab页的方法。 首先,我们需要确定需要删除的Tab页的位置,可以通过当前Tab页的index或者指定Tab页的文本来确定。 然后,我们需要调用TabWidget的removeTab()函数来删除Tab页。该函数需要传入要删除的Tab页的index值或Tab页所在的QTabWidget页,具体参数如下: void QTabWidget::removeTab(int index) void QTabWidget::removeTab(QWidget *widget) 其,第一个参数index是要删除的Tab页的索引,第二个参数widget是要删除的Tab页的QWidget页。 示例代码如下: ```c++ // 删除指定Tab页 int tabIndex = ui->tabWidget->indexOf(page2); // 获取要删除的Tab页的索引 ui->tabWidget->removeTab(tabIndex); // 删除指定Tab页 // 删除当前选Tab页 int curIndex = ui->tabWidget->currentIndex(); // 获取当前选Tab页索引 ui->tabWidget->removeTab(curIndex); // 删除当前选Tab页 ``` 至此,我们就完成了在Qt删除Tab页的操作。需要注意的是,在删除Tab页之后,界面控件的位置可能会发生变化,需要根据具体需求进行相应的布局调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昵称系统有问题

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

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

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

打赏作者

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

抵扣说明:

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

余额充值