QTabWidet设置不同Position,tabBar文字均水平显示

2023-11-12

设置QTabWidget在不同方向上的文字均水平显示。有两种方法,如下:

1、设置不同Position,tabBar文字均水平显示

QTabWidget设置在设置Position为East或者West时,文字方向默认会从下到上显示。先通过以下方法实现tabBar更改方向,但文字始终垂直显示。

方法1:通过继承QTabWidget来实现

用到函数:

void setTabButton(int index,ButtonPosition position,QWidget *widget);//给tabBar添加控件

QWidget *tabButton(int index,ButtonPosition) const;                             //获取tab上添加的控件

 

tabWidget头文件

#ifndef TABWIDGET_H
#define TABWIDGET_H
#include<QTableWidget>
#include<QLabel>
class tabWidget : public QTabWidget
{
    Q_OBJECT
public:
    explicit tabWidget(QWidget *parent = nullptr);

    void updateselect();                          //用来设置一开始选中的状态
    int addTab(QWidget *widget, const QString &); //重载(不是虚函数)

signals:

public slots:
    void slotSetLabelColor(int color);            //自定义槽(响应tabBar点击事件)
};

#endif // TABWIDGET_H

tabWidget cpp文件

#include "tabwidget.h"


tabWidget::tabWidget(QWidget *parent) : QTabWidget(parent)
{

    connect(this,SIGNAL(tabBarClicked(int)),this,SLOT(slotSetLabelColor(int)));

}

void tabWidget::slotSetLabelColor(int index)
{
    for(int i=0;i<this->count();i++)
    {
        this->tabBar()->tabButton(i,QTabBar::ButtonPosition::RightSide)->setStyleSheet("background-color:rgba(0,0,0,0);");
    }
    this->tabBar()->tabButton(index,QTabBar::ButtonPosition::RightSide)->setStyleSheet("background-color:rgba(0,0,0,0);color:white;");

}

int tabWidget::addTab(QWidget *widget, const QString &label)
{
    int nRetrun=QTabWidget::addTab(widget,"");
    int count=this->count()-1;
    QLabel *labelTab=new QLabel(label,this);
    QFont ft;
    ft.setPointSize(20);
    labelTab->setFont(ft);
    labelTab->setAlignment(Qt::AlignCenter);
    this->tabBar()->setTabButton(count,QTabBar::ButtonPosition::RightSide,labelTab);
    this->tabBar()->tabButton(count,QTabBar::ButtonPosition::RightSide)->setFixedHeight(64);
    updateselect();
    return nRetrun;

}

void tabWidget::updateselect()
{
    for(int i=0;i<this->currentIndex();i++)
    {
        this->tabBar()->tabButton(i,QTabBar::ButtonPosition::RightSide)->setStyleSheet("background-color:rgba(0,0,0,0);color:black;");
    }
    this->tabBar()->tabButton(this->currentIndex(),QTabBar::ButtonPosition::RightSide)->setStyleSheet("background-color:rgba(0,0,0,0);color:white;");

}

mainWindow  cpp

#pragma execution_character_set("utf-8")
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"tabwidget.h"
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tabWidget *m_tab=new tabWidget(this);
    QWidget *b1=new QWidget();
    QWidget *b2=new QWidget();

    m_tab->setGeometry(0,0,500,400);
    m_tab->setStyleSheet("QTabBar::tab{min-width:140px;max-width:140px;min-height:64px;max-height:64px;padding:0;}"
                     "QTabBar::tab:selected{background:#025bc7}");
    //设置tabwidget位置  更改位置
    m_tab->setTabPosition(QTabWidget::TabPosition::South);
    
    if((m_tab->tabPosition()==QTabWidget::TabPosition::South)||
            (m_tab->tabPosition()==QTabWidget::TabPosition::North))
        m_tab->setLayoutDirection(Qt::LeftToRight);//LeftToRight
    else//东西方向的layoutDirection
    {
         m_tab->setLayoutDirection(Qt::RightToLeft);//RightToLeft
    }
    m_tab->addTab(b1,"one");
    m_tab->addTab(b2,"two");
}

MainWindow::~MainWindow()
{
    delete ui;
}

参考博客:https://blog.csdn.net/skyztttt/article/details/52448992 

方法2: 重绘代码

#ifndef CUSTOMTABSTYLE_H
#define CUSTOMTABSTYLE_H
#include <QPainter>
#include <QProxyStyle>
#include <QStyleOptionTab>
#include <QRect>
#include <QSize>
class CustomTabStyle : public QProxyStyle
{
public:
    QSize sizeFromContents(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() = 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;
                allRect.setWidth(allRect.width() - 5);
                allRect.setHeight(allRect.height() - 2);
                //选中状态
                if (tab->state & QStyle::State_Selected) {
                    //save用以保护坐标,restore用来退出状态
                    painter->save();
                    painter->setBrush(QBrush(0x004ea1));
                    //矩形
                    //painter->drawRect(allRect.adjusted(0, 0, 0, 0));
                    //带有弧线矩形
                    painter->drawRoundedRect(tab->rect, 8, 8);
                    painter->restore();
                }
                //hover状态
                else if(tab->state & QStyle::State_MouseOver){
                    painter->save();
                    painter->setBrush(QBrush(0x004ea1));
                    painter->drawRoundedRect(allRect, 8, 8);
                    painter->restore();
                }
                else{
                    painter->save();
                    painter->setBrush(QBrush(0x78aadc));
                    painter->drawRoundedRect(allRect, 8, 8);
                    painter->restore();
                }
                QTextOption option;
                option.setAlignment(Qt::AlignCenter);
                painter->setFont(QFont("楷体", 18, QFont::Bold));
                painter->setPen(0xffffff);
                painter->drawText(allRect, tab->text, option);
                return;
            }
        }
        if (element == CE_TabBarTab) {
            QProxyStyle::drawControl(element, option, painter, widget);
        }
    }
};
tab->tabBar()->setStyle(new CustomTabStyle);//注意,设置上述代码风格 就可以实现QTabBar横向

此方法更适合已经存在的QTabWidget编辑好tab里面的内容。

注意:

1.如果east和west时候,显示不完,出现...,需要设置elidemode为ElideNone。

2.不能通过样式表设置QTabBar::tab的样式。

参考博客:https://blog.csdn.net/wojiaoanchao/article/details/78911891 

 3.分享一套代码,如下图:

代码链接:https://download.csdn.net/download/weixin_41882459/12774054

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

QTabWidet设置不同Position,tabBar文字均水平显示 的相关文章

  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • 如何使用 Qt DOM 通过此语法获取 xml 属性

    我正在使用 Qt DOM XML 解析器 并且遇到了如下属性定义的问题
  • QComboBox 下拉项边距

    我想设计我的风格QComboBox为下拉项目留出边距 现在是这样的 我想要这样的东西 我尝试过 QComboBox QAbstractItemView item margin 3px 但它不起作用 你能帮我解决这个问题吗 您想在项目之间设置
  • 在 QtCreator 中使用 .pro 和 .pri 正确(树)显示 Qt 项目

    是否可以使用项目包含文件 pri 显示不止一个额外级别 例如如果 pro文件包括 pri文件包含两个 pri files pro pri pri pri 在 QtCreator 项目 中显示具有误导性 pro pri pri pri 它根本
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • Qt 5.1.1 与 Visual Studio 2012 - 这些 QT 版本无法访问

    打开 Visual Studio 时出现此错误 我安装自http qt project org downloads http qt project org downloads 适用于 Windows 64 位的 Qt 5 1 1 VS 20
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 了解 Qt3D 创建的网格

    我创建了一个 Qt3D 网格 如下所示 Qt3DCore QEntity newEntity new Qt3DCore QEntity Qt3DExtras QConeMesh mesh new Qt3DExtras QConeMesh m
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • 使用 C++ 访问 Azure blob 存储 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren

随机推荐

  • pycharm:连接github

    一 github上创建账户 github是一个仓库 用于代码管理 我刚好想将代码放到仓库里面管理 因此 写了这篇博客 我想着 大体思路应该是 1 在github上面创建账号 2 在本地开启客户端 3 通过某种方式建立连接 4 pycharm
  • 纯css实现webpack的logo转动

    原效果 实现效果 源码
  • MobileNetV2

    MobileNetV2 MobileNetV2 Inverted Residuals and Linear Bottlenecks 摘要 在本文中 我们描述了一种新的移动架构MobileNetV2 它改进了移动模型在多个任务和基准以及不同模
  • NLP 利器 Gensim 库的使用之 Word2Vec 模型案例演示(基于 word2vec-google-news-300 预训练模型,附下载)

    Gensim 库的使用之 Word2Vec 模型案例演示 要见识一下 Word2Vec 模型可以做什么 那么最好的方法就是直接下载一个预训练模型 然后尝试用一下看看效果 我们在这里获取一个在 Google News 数据集上训练完成的 Wo
  • Linux配置网卡(virb0下线)

    1 网卡设置 1 1 桥接模式 1 1 1 编辑网卡 1 输入命令 vi etc sysconfig network scripts ifcfg eth0 2 进入编辑模式 按 i 键 3 编辑网卡配置 4 按esc键 回到命令模式 5 按
  • Windows安装多Java版本快速切换

    环境 Win10 JDK6 JDK8 安装JDK6 JDK8 点点点 修改环境变量 注意 修改系统环境变量 JAVA安装路径 JAVA HOME JAVA6 HOME 注意 如果你想切换 JDK 版本 就在此处设置即可 JAVA6 HOME
  • thttpd 运行环境

    1 基于thttpd的Web服务器的简单架设 1 0 为了给刚入门的自己少找麻烦 以下操作都是root用户 1 1 代码的编译安装 configure make and make install 注意可执行程序thttp在 usr loca
  • html获得焦点和失去焦点

  • 基于OpenCV3.0图像处理中常见的五个滤波函数

    初学OpenCV的开发者很容易被OpenCV中各种滤波方法所困扰 不知道到底该用哪里一个来做滤波 表面原因看起来是因为OpenCV中各种滤波方式实在是太多太杂 其背后原因是对各种滤波方法的应用场景认知出现了问题 所以这里小编从应用场景与项目
  • Vue毕业设计选题 游戏攻略资讯补丁售卖商城(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向大家分享一个今年 2022 最新完成的毕业设计项
  • 云中 GPU的AI训练,显卡分配

    AI 模型的训练 模型并行 就是把模型就行分层级 model model layer 0 model layer 1 model layer 2 model layer 3 比如 一个主机有4个CPU CPU0 CPU1 CPU2 CPU3
  • 超详细!百度富媒体检索比对系统的关键技术

    导读 百度富媒体检索比对系统是一套基于 Ann approximate nearest neighbor 检索和内容特征比对技术 旨在提供针对图像 音频 视频等多媒体资源的相似检索系统 包括离线训练 建库 在线特征提取 检索 目前百度富媒体
  • minikube 快速使用入门 - 启动 - 2

    快速使用 启动Minikube 执行命令 如下 minikube start 执行之后系统开始安装minikube 如图所示 上面显示正在下载安装包 进行安装 因为请求链接的是外网 应该会有点慢 可以使用如下命令 minikube exe
  • 三分钟学会国产低功耗华大单片机二(MDK中下载与仿真)

    一 准备工作 使用micro USB 将开发板与电脑相连 打开一个已经存在的工程 工程如何建立请参考 三分学会国产低功耗华大单片机一 MDK中新建工程 二 工程的编译 点击魔法棒图标如下图所示 点击Device在芯片型号选择框中选中所选单片
  • Autofac与WebApi集成

    目录 Autofac原理 如何将Autofac与Web API集成 Autofac功能详解 1 HttpConfiguration 2 控制器 3 解析器 4 过滤器 1 注册过滤器提供程序 2 实现过滤器接口 3 注册过滤器 4 过滤器覆
  • React结合Ant Design Pro开发项目理解(service、model、index等文件逻辑关系)

    组件中传值 react 值写在了视图层 Antd pro 值写在model层 通过saveState扩展表达式 把值更新到state后会触发视图层的render方法 通过props获取model中的值 下图是整个项目各模块的关系 大概流程是
  • 基于AntDesign实现的React.js自定义可编辑表格,带翻译功能

    基于React AntDesign实现的一个自定义的可编辑表格 主要用于数据库表字段的编辑 带翻译功能 稍作修改后也可复用到其他地方 主要包括三个文件 index js EditableTable js EditableTable less
  • Matlab R2018b激活教程

    最近重装了系统 又正好需要用一下Matlab 所以就来研究一下如何激活 目前Matlab最新的版本是R2018b 所以我找的也是R2018b的激活教程 再次提醒 如果有条件请支持正版 资源准备 很幸运 我发现已经有人将Matlab R201
  • Linux文件操作命令及磁盘分区与文件系统

    一 cd命令 cd change directory 切换目录 这是用来切换工作目录的命令 注意目录名称和cd命令之间存在一个空格 在介绍cd命令的时候 首先我们来了解相对路径和绝对路径 绝对路径 路径的写法 一定由跟目录 写起 例如 da
  • QTabWidet设置不同Position,tabBar文字均水平显示

    设置QTabWidget在不同方向上的文字均水平显示 有两种方法 如下 1 设置不同Position tabBar文字均水平显示 QTabWidget设置在设置Position为East或者West时 文字方向默认会从下到上显示 先通过以下