V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
neighbads
V2EX  ›  Qt

QTabWidget 如何把标签页放在左侧

  •  
  •   neighbads · 2020-11-05 16:24:10 +08:00 · 1958 次点击
    这是一个创建于 1239 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • windows 4k Height (30)

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

    • windows 4k Height (35)

    背景上的字符变小

    • mac 4k Height (35)

    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

    1 条回复    2020-11-20 16:23:23 +08:00
    neighbads
        1
    neighbads  
    OP
       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);
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1532 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 17:06 · PVG 01:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.