QTabWidget 改变tabBar位置 并改变文字方向

3 篇文章 0 订阅

起因

    QTabWidget默认的tabBar在最上端。
这里写图片描述

改进

    但有时需要将tabBar放置在左侧,但是设置后效果如下…
这里写图片描述

最终

    有时候需要如下效果,则需要自定义style:
这里写图片描述

附相应代码(具体边框可通过stylesheet进行设置)

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QPainter>
#include <QProxyStyle>

class CustomTabStyle : public QProxyStyle
{
public:
    QSize 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() = 90; // 设置每个tabBar中item的大小
            s.rheight() = 44;
        }
        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<const QStyleOptionTab *>(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(0x5d5d5d);
                }

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

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->setTabPosition(QTabWidget::West);
    ui->tabWidget->tabBar()->setStyle(new CustomTabStyle);

#if 0
    ui->tabWidget->setStyleSheet("QTabWidget::pane{ \
            border-left: 1px solid #eeeeee;\
        }");
#endif
}

MainWindow::~MainWindow()
{
    delete ui;
}
  • 31
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
PyQt5中,可以使用QTabWidget中的setTabPosition()函数来更改tabBar位置。 要更改文字方向,可以对QTabBar进行子类化并使用paintEvent()函数来自定义绘图。 下面是一个示例代码: ``` from PyQt5.QtWidgets import QApplication, QTabWidget, QWidget, QVBoxLayout, QTabBar from PyQt5.QtCore import Qt import sys class MyTabBar(QTabBar): def __init__(self): super().__init__() self.setAcceptDrops(True) def paintEvent(self, event): painter = MyPainter(self) painter.setPen(self.tabTextColor(0)) painter.setFont(self.font()) rect = self.geometry() rect.adjust(5, 5, -5, -5) for i in range(self.count()): painter.drawText(self.tabRect(i), Qt.AlignCenter, self.tabText(i)) class MyPainter(QTabBar): def __init__(self, tab_bar): super().__init__() self.tab_bar = tab_bar def drawText(self, rect, flags, text): font_metrics = self.fontMetrics() text_rect = font_metrics.boundingRect(rect, flags, text) centered_rect = Qt.AlignVCenter | Qt.AlignHCenter if self.tabPosition() == QTabWidget.South: self.rotate(-90) super().drawText(rect.translated(0, text_rect.height()), centered_rect, text) self.rotate(90) else: super().drawText(rect, centered_rect, text) class MainWindow(QWidget): def __init__(self): super().__init__() self.tabs = QTabWidget() self.tab1 = QWidget() self.tab2 = QWidget() self.tab3 = QWidget() self.tabs.addTab(self.tab1, "First Tab") self.tabs.addTab(self.tab2, "Second Tab") self.tabs.addTab(self.tab3, "Third Tab") self.tab_bar = MyTabBar() self.tabs.setTabBar(self.tab_bar) self.tabs.setTabPosition(QTabWidget.South) layout = QVBoxLayout() layout.addWidget(self.tabs) self.setLayout(layout) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 在这个示例中,我们创建了一个自定义的QTabBar类MyTabBar,并使用setTabBar()函数将其设置QTabWidget的标签栏。 我们还创建了一个自定义的QPainter类MyPainter,它重载了drawText()函数来自定义标签栏的绘制。 最后,我们将标签栏的位置设置QTabWidget.South,这将在窗口底部显示标签

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值