在Qt中,当我们使用tabWidget,有时会把tabPosition属性设置成东西朝向的。但这时,我们会发现tabBar中的文字朝向也变了,如下图所示:
而我们总是希望文字是正对着我们的,而不是翻转过后的样子。
这里,我们可以通过setStyle来设置widget的风格,而QTabBar是继承自widget的也可以通过同样的方式,设置风格。
setStyle函数的定义为void setStyle(QStyle *style),也就是说我们需要传一个QStyle类型的变量进去。
然后要说一个继承自QStyle的类:QProxyStyle
QProxyStyle
QProxyStyle类是一个简便的类,它简化了动态覆盖的QStyle元素。
QProxyStyle封装了一个QStyle(通常是默认的系统风格),用于动态覆盖绘画或其他特定风格的行为。
(以上为Qt帮助中的说明)
接下来,我们需要写一个自定义的继承自QProxyStyle的类,然后作为参数传到setStyle里面。
在这个自定义类中,我们重载QProxyStyle中的函数drawControl()
[override virtual] void QProxyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const
用提供的painter绘制给定的element,并使用选项指定的样式选项。
widget参数是可选的,可以用作绘制控件的帮助。 option参数是一个指向QStyleOption对象的指针,可以使用qstyleoption_cast()函数将其转换为正确的子类。
(以上为Qt帮助中的说明)
也就是说我们可以在drawControl中进行内容的绘图,可以改变TabBar的样式
代码如下(建一个继承于QProxyStyle的类):
class CustomTabStyle:public QProxyStyle
{
public:
CustomTabStyle(){}
QSize sizeFromContents(ContentsType type, const QStyleOption *option,
const QSize &size, const QWidget *widget) const //设置Bar上面的内容大小
{
QSize s = QProxyStyle::sizeFromContents(type, option, size, widget);
if (type == QStyle::CT_TabBarTab) {
s.transpose();
s.rwidth() = 100; // 设置每个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(option)) {
QRect allRect = tab->rect; //定义一个矩形区域
if (tab->state & QStyle::State_Selected) {
painter->save();
painter->setPen(0x89cfff);
painter->setBrush(QBrush(0x89cfff)); //蓝色底
painter->drawRect(allRect.adjusted(6, 6, -6, -6));
painter->restore();
}
QTextOption option;
option.setAlignment(Qt::AlignCenter); //使文字位置居中
if (tab->state & QStyle::State_Selected) { //设置文字颜色
painter->setPen(0xf8fcff); //白色字
}
else {
painter->setPen(0x000001); //黑色字
}
painter->drawText(allRect, tab->text, option);
return;
}
}
if (element == CE_TabBarTab) {
QProxyStyle::drawControl(element, option, painter, widget);
}
}
};
然后new一个CustomTabStyle给相应的tabBar:
ui->tabWidget->tabBar()->setStyle(new CustomTabStyle);
效果图:
转载请标明出处,原文地址:https://blog.csdn.net/come_from_pluto