赞
踩
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));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。