QTabWidget 为选项卡小部件,提供一个选项卡栏(参见 QTabBar)和一个“页面区域”,用于显示与每个选项卡相关的页面。 默认情况下,选项卡栏显示在页面区域的上方,但是可以使用不同的配置(请参见 TabPosition)。每个选项卡都与不同的小部件(称为页面)相关联。页面区域中只显示当前页面;其他所有页面都隐藏。用户可以通过单击其选项卡或按 Alt+ 字母快捷键(如果有)来显示不同的页面。

使用 QTabWidget 的正常方法是执行以下操作:

  • 创建一个 QTabWidget。
  • 为选项卡对话框中的每个页面创建一个 QWidget,但不要为它们指定父窗口小部件。
  • 将子窗口小部件插入页面窗口小部件,使用布局将其定位为正常位置。
  • 调用 addTab() insertTab() 将页面小部件放入选项卡小部件,为每个选项卡提供一个带有可选键盘快捷键的合适标签。
  • 先看最下面的示例代码的执行效果图:

    二、属性相关方法

    // 返回选项卡栏中的选项卡数
    int count() const
    // 返回当前选项卡页的索引位置    
    int currentIndex() const
    // 返回当前选项卡页的索引位置    
    void setCurrentIndex(int index)
    // 如何省略选项卡栏中的文本   
    void setElideMode(Qt::TextElideMode mode)
    // 设置选项卡栏中图标的大小
    void setIconSize(const QSize &size)
    // 设置用户是否可以在选项卡栏区域内移动选项卡    
    void setMovable(bool movable)
    // 设置为true,则当选项卡栏包含少于2个选项卡时,它将自动隐藏
    void setTabBarAutoHide(bool enabled)
    // 设置选项卡在此选项卡小部件中的位置
    void setTabPosition(QTabWidget::TabPosition position)
    // 设置选项卡小部件中选项卡的形状
    void setTabShape(QTabWidget::TabShape s)
    // 设置是否将关闭按钮自动添加到每个选项卡,默认为false    
    void setTabsClosable(bool closeable)
    // 当选项卡栏有许多选项卡时,此属性决定是否应使用按钮滚动选项卡    
    void setUsesScrollButtons(bool useButtons)
    

    三、增删选项的方法

    // 添加选项卡
    int addTab(QWidget *page, const QString &label)
    int addTab(QWidget *page, const QIcon &icon, const QString &label)
    // 插入选项卡
    int insertTab(int index, QWidget *page, const QString &label)
    int insertTab(int index, QWidget *page, const QIcon &icon, const QString &label)
    // 清空选项卡
    void clear()
    // 移除选项卡
    void removeTab(int index)
    

    四、选项栏和内容控件

    // 获取内部的TabBar
    QTabBar * tabBar() const
    // 获取指向具有给定索引的页面小部件
    QWidget * widget(int index) const
    // 查找小部件的索引位置
    int indexOf(QWidget *w) const
    // 获取当前选择tab指向的子页面    
    QWidget * currentWidget() const    
    // 获取角落控件
    QWidget * cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const
    // 设置角落控件    
    void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)
    

    五、选项修改

    // 设置tab使能
    bool isTabEnabled(int index) const
    // 是否可用    
    void setTabEnabled(int index, bool enable)
    // 是否可见   
    bool isTabVisible(int index) const
    // 设置可见    
    void setTabVisible(int index, bool visible)
    // 获取tab上的图标    
    QIcon tabIcon(int index) const
    // 设置tab上的图标     
    void setTabIcon(int index, const QIcon &icon)
    // 获取tab的文本    
    QString tabText(int index) const
    // 设置tab的文本    
    void setTabText(int index, const QString &label)
    // 获取tab的ToolTip    
    QString tabToolTip(int index) const
    // 设置tab的ToolTip     
    void setTabToolTip(int index, const QString &tip)
    

    六、QTabWidget的样式表

    /*************************** 选项卡界面 ***************************/
    /*** 基本的设置 ***/
    QTabBar::tab{
        font-size: 14px;
        min-width: 80;
        min-height: 30;
        max-width: 145;
        max-height: 30;
        padding-left: 6px;
    /*** 设置 pane的样式 ***/
    QTabWidget::pane{
        background: rgba(14,73,122,0.4);
        border:none; /*去除widget边框 如果不去除,视觉上TabBar的背景颜色会进入到窗口里,不好看*/
    /*** 标签未选中时显示 ***/
    QTabBar::tab:!selected {
        background: rgba(20,45,86,0.5);
        color: rgba(255,255,255,0.5);
    /*** 标签被覆盖 ***/
    QTabBar::tab:hover {
        background: rgba(14,73,122,0.4);
        color: rgba(255,255,255,0.7);
    QTabBar::tab:hover {
        background: rgba(14,73,122,0.5);
        color: rgba(255,255,255,0.9);
    /*** 标签被选中 ***/
    QTabBar::tab:selected {
        background: rgba(0,147,221,0.7);
        color: rgba(255,255,255,1.0);
    /*** 左箭头 ***/
    QTabBar QToolButton::left-arrow
        background: transparent;
        ;
    /*** 右箭头 ***/
    QTabBar QToolButton::right-arrow
        background: transparent;
    /*** 选项卡的滚动条 ***/
    QTabBar::scroller {
        background: transparent;
        width: 0px; /* 隐藏了滚动条,就可以隐藏标签页左右按钮 */
        ;
    /*** 选项卡标签的关闭按钮 ***/
    QTabBar::close-button {
        border-image: url(:/Image/btn_tabClose_nor.png);
        subcontrol-position: right;
    QTabBar::close-button:hover {
        border-image: url(:/Image/btn_tabClose_hov.png);
    QTabBar::close-button:pressed {
        border-image: url(:/Image/btn_tabClose_pre.png);
    

    七、示例代码

    Widget.h:

    #ifndef WIDGET_H
    #define WIDGET_H
    #include <QWidget>
    #include <QLabel>
    #include <QLineEdit>
    #include <QPushButton>
    #include <QRadioButton>
    #include <QCheckBox>
    #include <QTabWidget>
    #include <QTabBar>
    #include <QHBoxLayout>
    #include <QFormLayout>
    #include <QProxyStyle>
    #include <QPainter>
    // 自定义TabBar样式,以实现TabBar的文本左对齐
    class CustomTabStyle : public QProxyStyle
    public:
        void drawItemText(QPainter* painter, const QRect& rectangle, int alignment,
                          const QPalette& palette, bool enabled, const QString& text,
                          QPalette::ColorRole textRole ) const
            painter->save();
            alignment = Qt::AlignLeft | Qt::AlignVCenter;
            painter->translate(0, 0);
            QCommonStyle::drawItemText(painter, rectangle,
                                  alignment,
                                  palette,
                                  enabled,
                                  text,
                                  textRole );
            painter->restore();
    class Widget : public QWidget
        Q_OBJECT
    public:
        Widget(QWidget *parent = nullptr);
    private:
        QTabWidget *m_pTabWidget; // 选项卡界面
        QPushButton *m_pBtnHideTab; // 隐藏选项卡界面按钮
        QWidget *m_pWidget1; // 子界面1
        QWidget *m_pWidget2; // 子界面2
        QWidget *m_pWidget3; // 子界面3
    #endif // WIDGET_H
    

    Widget.cpp:

    #include "Widget.h"
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        // 界面初始化
        this->setFixedSize(320, 200);
        this->setFocusPolicy(Qt::StrongFocus);
        this->setAttribute(Qt::WA_StyledBackground);
        this->setObjectName("MeetUserList");
        // 初始化选项卡界面
        m_pTabWidget = new QTabWidget(this);
        m_pTabWidget->setFixedSize(width(), height());
        m_pTabWidget->tabBar()->setStyle(new CustomTabStyle); // 实现TabBar的文本左对齐
        m_pTabWidget->setTabsClosable(true);  // 将关闭按钮自动添加到每个选项卡
        m_pTabWidget->setMovable(true); // 设置用户是否可以在选项卡栏区域内移动选项卡,默认为false
        // 初始化子界面1
        m_pWidget1 = new QWidget;
        QFormLayout *pFormLayout = new QFormLayout(m_pWidget1);
        pFormLayout->addRow("姓名", new QLineEdit());
        pFormLayout->addRow("地址", new QLineEdit());
        // 初始化子界面2
        m_pWidget2 = new QWidget;
        QHBoxLayout *pHBoxLayout2 = new QHBoxLayout(m_pWidget2);
        pHBoxLayout2->addWidget(new QRadioButton("男"));
        pHBoxLayout2->addWidget(new QRadioButton("女"));
        // 初始化子界面3
        m_pWidget3 = new QWidget;
        QHBoxLayout *pHBoxLayout3 = new QHBoxLayout(m_pWidget3);
        pHBoxLayout3->addWidget(new QCheckBox("物理"));
        pHBoxLayout3->addWidget(new QCheckBox("化学"));
        // 添加各子界面
        m_pTabWidget->addTab(m_pWidget1, "联系方式");
        m_pTabWidget->addTab(m_pWidget2, "个人信息");
        m_pTabWidget->addTab(m_pWidget3, "科目");
        // 当点击第参数个选项卡的关闭按钮的时候,发出信号
        connect(m_pTabWidget->tabBar(), &QTabBar::tabCloseRequested, [=](int index){
            if (index == -1)
                return;
            // 移除Tab
            m_pTabWidget->removeTab(index);
        // 当双击第参数个选项卡的时候,发出信号
        connect(m_pTabWidget->tabBar(), &QTabBar::tabBarDoubleClicked, [=](int index){
            if (index == -1)
                return;
            // 移除Tab
            m_pTabWidget->removeTab(index);