当前位置:   article > 正文

QTabWidget中tab页文本水平或垂直设置_python tabwidget字体方向

python tabwidget字体方向

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; // 此处高度变高了一点
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

测试代码

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));
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/613530
推荐阅读
相关标签
  

闽ICP备14008679号