1. 程式人生 > >QTabWidget 改變tabBar位置 並改變文字方向

QTabWidget 改變tabBar位置 並改變文字方向

起因

    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; }