QTabWidget的每个tab居中显示图标和文本

devtools/2024/10/15 4:15:21/

使用QTabWidget,给每个tab添加了图标之后,文字和图标之间有间距,没有完美居中显示。

遇到此问题,尝试了多种办法,均不理想,最终自定义QTabBar,重绘tab,完美解决。

#include <QTabBar>
#include <QStylePainter>class MyTabBar : public QTabBar {
public:MyTabBar(QWidget *parent = nullptr) : QTabBar(parent){}protected:void paintEvent(QPaintEvent *) override{QStylePainter painter(this);for (int index = 0; index < this->count(); ++index) {QStyleOptionTab opt;initStyleOption(&opt, index);// 计算图标和文字的长度(含间距)int iconTextWidth = opt.iconSize.width()+ opt.fontMetrics.horizontalAdvance(opt.text)+ 4; // 4 是图标和文字的间距int x = (opt.rect.width() - iconTextWidth) / 2 + opt.rect.width() * index;painter.save();// 指定各状态下的按钮状态if (opt.state & QStyle::State_Selected) { // 按下状态painter.setPen(QColor(255, 255, 255));painter.fillRect(rect, QColor(31, 68, 133));} else if (opt.state & QStyle::State_MouseOver) { // 鼠标停留状态painter.setPen(QColor(255, 255, 255));painter.fillRect(rect, QColor(33, 72, 141));} else if (!(opt.state & QStyle::State_Enabled)) { // 禁止状态painter.setPen(QColor(255, 255, 255, 153));painter.fillRect(rect, QColor(84, 123, 192));} else { // 正常状态(默认)painter.setPen(QColor(255, 255, 255));painter.fillRect(rect, QColor(41, 90, 176));}QRect iconRect(x, (opt.rect.height() - opt.iconSize.height()) / 2,opt.iconSize.width(), opt.iconSize.height());painter.drawPixmap(iconRect, opt.icon.pixmap(opt.iconSize));QRect textRect(iconRect.right() + 4, 0,opt.rect.width() * (index + 1) - iconRect.right() - 4,opt.rect.height());painter.drawText(textRect, Qt::AlignVCenter | Qt::AlignLeft, opt.text);painter.restore();}}
};

调用:

ui->tabWidget->setTabBar(new MyTabBar(this));


http://www.ppmy.cn/devtools/125974.html

相关文章

docker+mysql创建用户名密码_docker里面的mysql 更换密码

进入mysql容器 操作vi etc/mysql/my.cnf 默认是不安装vi编辑器的&#xff0c;下面安装vi 更新安装包 apt-get update 安装vim 执行这条语句 apt-get install vim 到修改docker容器里面的mysql数据库密码了 启动mysql容器 docker exec -it mysql /bin/bash 编辑配置文件 我这里是…

关于Transformer的相关问题

&#x1f381;&#x1f449;点击进入文心快码 Baidu Comate 官网&#xff0c;体验智能编码之旅&#xff0c;还有超多福利&#xff01;&#x1f381; &#x1f50d;【大厂面试真题】系列&#xff0c;带你攻克大厂面试真题&#xff0c;秒变offer收割机&#xff01; ❓今日问题&am…

【数据结构与算法初阶】前言介绍

一.什么是数据结构? 数据结构是计算机存储&#xff0c;组织数据的方式&#xff0c;指相互存在一种或者多种特殊关系的数据元素的集合 二.什么是算法? 算法就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为 输出。简单来说算…

MVC案例整合Spring和Hibernate

说到整合Spring和Hibernate首先要搞清楚&#xff0c;整合什么&#xff1f; 1、使用Spring的IOC容器来生产Hibernate的SessionFactory对象实例 2、让Hibernate使用Spring的声明式事务 整合步骤 1、先加入Hibernate 2、在加入Spring&#xff0c;整合 新建项目&#xff0c;建…

架构设计笔记-17-通信系统架构设计理论及实践

目录 知识要点 案例分析 1.数据中心架构的技术 论文 1.论网络安全体系设计 知识要点 开放系统的存储方式主要有&#xff1a; 1. 直连式存储&#xff08;Direct-Attached Storage&#xff0c;DAS&#xff09;&#xff1a;在服务器上外挂一组大容量硬盘&#xff0c;存储设…

python基础-如何分文件编写

在Python中&#xff0c;为了使代码更具可读性和模块化&#xff0c;通常会将代码拆分到多个文件中。这种方式有助于将不同功能模块分离&#xff0c;使代码更容易维护和重用。以下是如何通过分文件编写Python代码的一些方法和示例&#xff1a; 1. 使用模块&#xff08;.py 文件&…

004 【第二章第三节】数据类型

目录 数据类型的介绍 C 语言中的数据类型分类 GCC 中其本数据类型的取值范围 数据类型的介绍 在高级程序设计语言中引入数据类型&#xff08;Data Type&#xff09;的主要目的是便于在程序中对它们按不同方式和要求进行处理。 由于不同类型的数据在内存中占用不同大小的存储…

Android 安装过程五 MSG_INSTALL消息的处理 安装

现在马上进入正式的安装流程。   从前面文章 Android 安装过程四 MSG_INSTALL消息的处理 安装之前的验证知道&#xff0c;在验证之后没有什么问题的情况下&#xff0c;会回调onVerificationComplete()方法&#xff0c;它位于PackageInstallerSession类中。 private void onVe…