You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.6 KiB
C++

#include "FITKTabWidget.h"
#include <QFontMetrics>
namespace Comp
{
FITKTabWidget::FITKTabWidget(FITKTabWidgetType type, QWidget * parent) :
QTabWidget(parent), _type(type)
{
switch (_type) {
case Comp::FITKTabWidgetType::FITKTab_None: break;
case Comp::FITKTabWidgetType::FITKTab_Fill: break;
case Comp::FITKTabWidgetType::FITKTab_Auto: {
FITKTabBar* customTabBar = new FITKTabBar(this);
this->setTabBar(customTabBar);
break;
}
}
}
FITKTabWidget::~FITKTabWidget()
{
}
int FITKTabWidget::findTabIndex(QString tabName)
{
int tabCount = this->count();
for (int i = 0; i < tabCount; i++) {
QString name = this->tabText(i);
if (name == tabName)return i;
}
return -1;
}
void FITKTabWidget::showEvent(QShowEvent * event)
{
QTabWidget::showEvent(event);
changeStyleSheet();
}
void FITKTabWidget::resizeEvent(QResizeEvent * event)
{
QTabWidget::resizeEvent(event);
changeStyleSheet();
}
void FITKTabWidget::changeStyleSheet()
{
QString styleSheet = "";
switch (_type) {
case Comp::FITKTabWidgetType::FITKTab_None:return;
case Comp::FITKTabWidgetType::FITKTab_Fill: {
int width = this->width();
int tabCount = this->count();
int tabWidth = width / tabCount;
styleSheet = QString(
"QTabBar::tab { "
" width:%1px;"
" height:30px;"
" left: 0px;"
" right: 0px;"
"}"
"QTabBar::tab:selected {"
" border-bottom: 2px solid #007bff;" // 选中的标签页底部使用蓝色边框
"}"
"QTabBar::tab:hover {"
" border-bottom: 2px solid #d3d3d3;" // 悬浮时标签页底部使用灰色边框
"}"
).arg(tabWidth);
this->tabBar()->setStyleSheet(styleSheet);
break;
}
case Comp::FITKTabWidgetType::FITKTab_Auto: {
styleSheet =
"QTabBar::tab {"
" background: lightgray;" // 标签页背景色
" border: 1px solid darkgray ;" // 标签页边框
" left: 0px;"
" right: 0px;"
"}"
"QTabBar::tab:selected {"
" background: white;" // 选中的标签页背景色
" border-bottom: none;" // 移除底部边框以避免与选中状态的边框重叠
"}"
;
this->tabBar()->setStyleSheet(styleSheet);
styleSheet = "QTabWidget::pane {"
" border: 1px solid #d0d0d0;" // QTabWidget 的边框
"}";
this->setStyleSheet(styleSheet);
break;
}
}
}
//---------------------------------------------------------------------------------------------------------------
FITKTabBar::FITKTabBar(QWidget * parent) :
QTabBar(parent)
{
}
FITKTabBar::FITKTabBar()
{
}
QSize FITKTabBar::tabSizeHint(int index) const
{
// 根据每个标签页的标题计算宽度
QString text = tabText(index);
QFontMetrics fm(font());
int textWidth = fm.horizontalAdvance(text);
// 添加一些填充
int padding = 20;
// 设置宽度和默认高度
return QSize(textWidth + padding, 30);
}
}