QTabWidget 如何把标签页放在左侧

2020-11-05 16:24:10 +08:00
 neighbads

搜索了几个代码实现,显示效果都不是很理想。

可以看到 背景上有个不知道什么字符

背景上的字符变小

MAC 里简直不能看


代码,网上搜到的基本都是这样修改的:

qtabwidgetex.cpp

#include "qtabwidgetex.h"

QTabBarStyle::QTabBarStyle(QStyle *parent) : QProxyStyle(parent)
{

}

void QTabBarStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const
{
    if(element == CE_TabBarTabLabel)
    {
        const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option);
        if(tab)
        {
            QStyleOptionTab opt(*tab);
            opt.shape = QTabBar::RoundedNorth;
            //opt.icon = QIcon(":/res/11.ico");
            //opt.text = "Hello";
            //opt.palette.setCurrentColorGroup(QPalette::Disabled);
            //opt.state |= QStyle::State_Sunken;
            QProxyStyle::drawControl(element, &opt, painter, widget);
        }
    }

    QProxyStyle::drawControl(element, option, painter, widget);
}

QSize QTabBarStyle::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.setWidth(120);
        s.setHeight(35);
    }
    return s;
}


QTabWidgetEx::QTabWidgetEx(QWidget *parent) : QTabWidget(parent)
{
    m_tabbar = new QTabBar(this);
    m_tabbar->setMovable(false);
    m_tabbar->setStyle(new QTabBarStyle());
    this->setTabBar(m_tabbar);
    this->setTabPosition(QTabWidget::West);
}

QTabWidgetEx::~QTabWidgetEx()
{

}

qtabwidgetex.h

#ifndef QTABWIDGETEX_H
#define QTABWIDGETEX_H

#include <QWidget>
#include <QTabWidget>
#include <QTableWidgetItem>
#include <QTabBar>
#include <QProxyStyle>
#include <QPainter>


class QTabBarStyle : public QProxyStyle
{
    Q_OBJECT
public:
    explicit QTabBarStyle(QStyle *style = nullptr);

    void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override;
    QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const override;
};

class QTabWidgetEx : public QTabWidget
{
    Q_OBJECT
public:
    explicit QTabWidgetEx(QWidget *parent = nullptr);
    ~QTabWidgetEx();

signals:

public slots:

private:
    QTabBar *m_tabbar;
};

#endif // QTABWIDGETEX_H

完整工程连接: https://cowtransfer.com/s/5add1fda5fe44b

1980 次点击
所在节点    Qt
1 条回复
neighbads
2020-11-20 16:23:23 +08:00
少了个 return;

```c++
void QTabBarStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = nullptr) const
{
if(element == CE_TabBarTabLabel)
{
const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option);
if(tab)
{
QStyleOptionTab opt(*tab);
opt.shape = QTabBar::RoundedNorth;
//opt.icon = QIcon(":/res/11.ico");
//opt.text = "Hello";
//opt.palette.setCurrentColorGroup(QPalette::Disabled);
//opt.state |= QStyle::State_Sunken;
QProxyStyle::drawControl(element, &opt, painter, widget);
return;
}
}

QProxyStyle::drawControl(element, option, painter, widget);
}
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/722084

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX