QTabWidget中tab页文本水平或垂直设置

QTabWidget的tabPosition为West或East时,实现文字水平显示或文字垂直显示
百度网盘链接
链接:https://pan.baidu.com/s/1iRq4Wg6NzD3cs-_WEGtN8g
提取码:uaom
注:第五个tabWidget由于高度与宽度转换导致父类绘制triangle时出现问题,所以将高度变高了一点,若需求明确,完全可以自行绘制三角形或其他任意形状。

else // m_orientation == Qt::Horizontal
{
	size.transpose();//(tab页标签在WEST方向,并且文字水平横向排列时使用)
	size.rwidth() += 10;
	size.rheight() += 50; // 此处高度变高了一点
}

效果图
在这里插入图片描述
核心代码

void TabBarStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget /*= nullptr*/) const
{// <1> 此处element类型为:CE_TabBarTab,CE_TabBarTabShape,CE_TabBarTabLabel;
 // <2> 当element == CE_TabBarTabLabel时,QProxyStyle::drawControl函数会调用drawItemText函数,
 // <3> 由于drawItemText函数内得到的rect,并没有此处得到的controlRect容易理解
 // <4> 所以我们要重新实现drawItemText函数,并让该函数体为空,即不要让drawItemText函数绘制文本
 // <5> 而将绘制文本工作放在此处进行处理
	
	// 步骤一:调用父类的绘制控件函数
	QProxyStyle::drawControl(element, option, painter, widget);
	
	// 步骤二:重新绘制tab标签页文本
	if (element == CE_TabBarTabLabel) {
		if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
			QRect controlRect = tab->rect;
			
			QString tabText;
			if (m_orientation == Qt::Vertical)
			{
				// 将文本字符串换行处理
				for (int i = 0; i < tab->text.length(); i++)
				{
					tabText.append(tab->text.at(i));
					tabText.append('\n');
				}
				if (tabText.length() > 1)
					tabText = tabText.mid(0, tabText.length() - 1);
			}
			else
				tabText = tab->text;
		
			// 文本居中对齐
			QTextOption option;
			option.setAlignment(Qt::AlignCenter);
			QPen pen = painter->pen();
			pen.setColor(tab->palette.color(QPalette::WindowText));	// 文本颜色
			painter->setPen(pen);
			painter->drawText(controlRect, tabText, option);
		}
	}
}

void TabBarStyle::drawItemText(QPainter *painter, const QRect &rect, int flags, const QPalette &pal, bool enabled, const QString &text, QPalette::ColorRole textRole /*= QPalette::NoRole*/) const
{
	// 重写虚函数,但是函数体内什么都不用写,原因如下:
	// <1> 因为drawControl函数中得到的controlRect是整个tab标签页的大小(tab标签页指某一个选项卡页面,不是指整个tabBar)
	// <2> 而此处rect得到的不知道是什么大小
	// <3> 所以索性就在drawControl函数中绘制文本了(在drawControl函数中我们已经将字符串做换行处理并重新绘制文本了)
}

QSize TabBarStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &contentsSize, const QWidget *widget /*= nullptr*/) const
{
	QSize size = contentsSize;
    if (type == CT_TabBarTab)
    {
		if (m_orientation == Qt::Vertical)
		{
			size.rwidth() += 10;
			size.rheight() += 20;
		}
		else // m_orientation == Qt::Horizontal
		{
			size.transpose();//(tab页标签在WEST方向,并且文字水平横向排列时使用)
			size.rwidth() += 10;
			size.rheight() += 50;
		}
    }

	return size;
}

测试代码

ui->tabWidget_2->tabBar()->setStyle(new TabBarStyle());
ui->tabWidget_3->tabBar()->setStyle(new TabBarStyle());
ui->tabWidget_4->tabBar()->setStyle(new TabBarStyle(Qt::Horizontal));
ui->tabWidget_5->tabBar()->setStyle(new TabBarStyle(Qt::Horizontal));
  • 16
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浮生卍流年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值