Qt QTabWidget标签页左侧显示文字无法水平显示解决方案

 重写QProxyStyle

#pragma once


#include <QProxyStyle>
#include <QStyleOptionTab>
#include "CreateSteeing.h"
class QSteeing : public QProxyStyle
{
	Q_OBJECT

public:
	QSteeing();
	~QSteeing();

	//初始化
	void Init();

	/* sizeFromContents
	*  用于设置Tab标签大小
	* 1.获取原标签大小
	* 2.宽高切换
	* 3.强制宽高
	* 4.return
	* */
	QSize sizeFromContents(ContentsType type, const QStyleOption* option,
		const QSize& size, const QWidget* widget) const;

	/* drawControl
 *  画控件
 * 1.过滤CE_TabBarTabLabel
 * 2.选择状态下的背景绘制
 *      a.获取Rect
 *      b.保存旧的画笔
 *      c.设置新画笔
 *      d.画 Rect
 *      e.恢复旧的画笔
 * 3.设定Text对齐及选中/非选中状态下的Text颜色
 * 4.过滤CE_TabBarTab,对其进行绘制
 * */
	void drawControl(ControlElement element, const QStyleOption* option, QPainter* painter, const QWidget* widget) const;




};

 

#include "QSteeing.h"
#include <QString>
#include <QPainter>


QSteeing::QSteeing()
{

}

QSteeing::~QSteeing()
{


}



QSize QSteeing::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() = 120; // 设置每个tabBar中item的大小
		s.rheight() = 44;
	}
	return s;
}

void QSteeing::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;

			if (tab->state & QStyle::State_Selected) {
				painter->save();
				painter->setPen(0x89cfff);
				painter->setBrush(QBrush(0x89cfff));
				QRect nrct = allRect.adjusted(6, 6, -6, -6);
				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(0x5d5d5d);
			}

			painter->drawText(allRect, tab->text, option);
			return;
		}
	}

	if (element == CE_TabBarTab) {
		QProxyStyle::drawControl(element, option, painter, widget);
	}
}

#include "QSteeingUI.h"
#include "QSteeing.h"


QSteeingUI::QSteeingUI(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	//将标签页设置为左侧,但是会导致标签页文字方向为垂直显示需要改成水平显示,需要添加类实现
	ui.tabWidget->setTabPosition(QTabWidget::West);

	m_createSteeing = new CreateSteeing;

	ui.tabWidget->setAttribute(Qt::WA_StyledBackground);

	ui.tabWidget->insertTab(0, m_createSteeing, QString::fromLocal8Bit("创建设置"));

	ui.tabWidget->tabBar()->setStyle(new QSteeing);

	ui.tabWidget->tabBar()->setStyleSheet(
		" QTabBar::tab{height:100}"
		" QTabBar::tab{width:100}"
	);

}

QSteeingUI::~QSteeingUI()
{


}

效果:

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值