QTabWidget 改變tabBar位置 並改變文字方向
阿新 • • 發佈:2019-01-01
起因
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;
}