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

2023-11-14

 

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实战派学习群

在这里插入图片描述

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • 如何在 Qt-Embedded 中(正确)输出多语言文本?

    我的目标系统是 linux 3 3 7 Qt Embedded 开源版 4 8 Droid 字体 取自 fonts droid 20111207 git 1 all deb Debian 软件包并复制到 usr lib fonts目录 主要
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 为 Windows 98 编译 Qt

    我需要支持 Windows 98 Qt 文档声称这是可能的 但没有说明 Qt 4 6 的分布式二进制文件不能在 Win98 上运行 而且我采样的大多数 Qt 应用程序也不能在 Win98 上运行 对于几个确实在 98 上运行的应用程序 我询
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • Qt 5.6 测试版 Visual Studio 2015

    我已经安装了这个 http download qt io development releases qt 5 6 5 6 0 beta qt opensource windows x86 msvc2015 5 6 0 beta exe mi
  • 如何在 QtQuick 2 中对 QML TableView 进行排序?

    我想使用 Qt 5 1 实现具有自定义角色的可排序 TableView 但我不知道当用户单击标题时该怎么做才能对其进行排序 在我的 Qt pro 文件中 我添加了 android ios blackberry qtHaveModule wi
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • QML 连接:不推荐使用连接中隐式定义的 onFoo 属性

    升级到 Qt 5 15 时收到以下错误消息 QML Connections Implicitly defined onFoo properties in Connections are deprecated Use this syntax
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码

随机推荐

  • 数据结构day3(2023.7.17)

    一 Xmind整理 二 课上练习 练习1 时间复杂度 时间复杂度 只保留最高阶 f n 3 n 3 n 2 100 n T n O 3 n 3 n 2 100 n O 3 n 3 O n 3 1 gt O 1 常数阶 int t a 1 a
  • 使用百度地图JavaScript实现驾车/公交/步行导航功能

    1 2 3 4 5
  • 【语义分割】12、Fully Attentional Network for Semantic Segmentation

    文章目录 一 背景和动机 二 方法 三 效果 出处 AAAI2022 一 背景和动机 语义分割中 non local NL 的方法起到了很好了捕捉 long range 信息的作用 大致可分为 Channel non local 和 Spa
  • 使用insert into和insert overwrite插入数据的区别【Hive or Odps】

    1 创建一个测试表insert test 标识创建表insert test 默认新增id列 并插入一条数据1 CREATE TABLE insert test AS SELECT 1 AS id 2 插入数据 使用insert into插入
  • 记录:查看ubuntu版本信息。

    cat proc version uname a lsb release a WSL Ubuntu 20 04运行结果 lsb release a 查看Release和Codename uname a 内核版本和操作系统32 64位 cat
  • 32位机内存管理(下)

    既然这样 段描述符表放在那里呢 80386中引入了两个新的寄存器来管理描述符表 一个是48位的全局描述符表寄存器GDTR 一个是16位的局部描述符表寄存器LDTR 那么 为什么有两个描述符表寄存器呢 GDTR指向的描述符表为全局描述符表GD
  • 数据库原理 封锁的粒度

    1 封锁粒度是什么 封锁对象的大小称为封锁的粒度 封锁对象 逻辑单元 物理单元 2 选择封锁粒度的原则 封锁粒度和系统的并发度 系统的开销密切相关 封锁的粒度越大 数据库能够封锁的数据单元就越少 并发度就越小 系统开销也就越小 封锁的粒度越
  • Android三维模型解决方案

    1 原生OpenGL ES 无需多说 虽然OpenGL已经出来这么多年了 但无疑还是现在普及最广的 尤其在移动端 所以用原生OpenGL ES方案可以解决 2 jpct 最推荐 JPCT是一款基于OpenGL技术开发的3D图形引擎 PC环境
  • 数据迁移-jdbc

    1 jdbc工具类 import java io BufferedInputStream import java io FileInputStream import java io InputStream import java util
  • nginx的https和http共存反向代理配置

    一 设置http反向代理 正在上传 重新上传取消 upstream ly com server 192 168 1 100 88 server 192 168 1 101 88 upstream home ly com server 192
  • Git本地项目推送到远程仓库

    目录 1 初始化git 2 添加远程地址并给地址起一个别名 3 合并远程代码 4 推送 5 常见问题 6 无法推送 7 查看远程仓库信息 8 拉取与本地不相关的git项目 9 配置ssh公钥 1 初始化git 进入项目目录 git init
  • np.mgrid

    功能 返回多维结构 常见的如2D图形 3D图形 np mgrid 第1维 第2维 第3维 第n维的书写形式为 a b c c表示步长 为实数表示间隔 该为长度为 a b 左开右闭 或 a b cj cj表示步长 为复数表示点数 该长度为 a
  • R语言实战笔记--第十六章 高级图形进阶

    R语言实战笔记 第十六章 高级图形进阶 标签 空格分隔 R语言 lattice 交互式图形 图形系统简介 本文为R语言实战中最后一章 介绍的是图形的高级进阶 主要讲述了两个包 lattice和ggplot2 以及交互式图形的做法 极大扩展了
  • NacosSpringCloud

    Nacos尝试配置SpringCloud 新来了一个项目 有并发要求 选择了springcloud这套 至于eureka已经闭源了 就没有考虑 最后选择了阿里的nacos 服务发现和配置中心都集中在注册中心 配置支持动态加载 中文文档丰富
  • 视频质量算法有几种的介绍,视频质量技术及编码

    首先介绍SSIM是一种全参考 Full Rerence 视频质量评价算法 全参考视频图像质量评价指标 它分别从亮度 对比度 结构三方面度量视频图像相似性 而全参考评价算法必须同时知道原始视频和失真视频 也就是想计算结构相似度 就得先找到两个
  • 打开win7的系统更新服务器失败,win7的windows update无法启动,手动在服务里启动提示“错误2:系统找不到指定文件...

    您好 该问题有可能是系统文件损坏导致的 建议您尝试以下方法操作 方法一 建议您暂时卸载掉电脑上安装的第三方杀毒软件 再打开控制面板 操作中心 疑难解答 点使用Windows Update 解决问题 根据提示自动修复更新是出现的问题 方法二
  • 关于HttpClient请求获取数据

    httpClient请求获取网站数据 今天一网友问我 他写的httpClient请求为什么获取不到数据 他写的代码如下 StringBuffer buffer new StringBuffer String url1 http api ji
  • 深入云存储系统Swift核心组件:Ring实现原理剖析

    深入云存储系统Swift核心组件 Ring实现原理剖析 简介 OpenStack是一个美国国家航空航天局和Rackspace合作研发的开源云计算项目 并成为Apache下的一个重要开源项目 目前已经发展到了180家公司参与其中 OpenSt
  • MySQL学习笔记

    Windows服务 启动MySQL net start mysql 创建Windows服务 sc create mysql binPath mysqld bin path 注意 等号与值之间有空格 连接与断开服务器 mysql h 地址 P
  • 改造QTabWidget的QTabBar,自绘随意控制样式,不同颜色

    1 简介 本文介绍通过自绘 随意定制QTabWidget的 TabBar的方法 可设置不同Tab页的不同背景色 前景色 边框 鼠标三态色 尺寸 以及绘制其他自定义内容 如角标 2 效果 3 主要思路 继承QTabBar 改尺寸就是重写 ta