Qt中QTabWidget隐藏某些tab

对于一个QTabWidget,有时我们需要在不同的状态下显示不同的tab,需要隐藏掉某些tab。使用removeTab()固然可以做到,但是这样的话我们再次需要显示这些tab时再把它们加进去,有时候计算index会很麻烦。所以有没有什么办法可以在不删除tab的前提下隐藏掉某些tab呢,这样就能避免再次添加tab和计算index的麻烦。 
遗憾的是Qt并没有对tab提供类似hide()或者setVisible()这样的接口(查看源码你会发现tab并不是QWidget),那么怎么做呢?我的方案是这样的:利用QTabWidget::setTabEnabled()接口与QSS来共同实现隐藏tab。 
setTabEnabled()很容易理解,可以在不需要使用某些tab时将其禁用掉。但是禁用掉tab并不会使其隐藏,这时就需要QSS出马了。QSS实际上也不能隐藏tab,但它可以把处于禁用状态的tab宽度设为0,同时将文字颜色设为透明,然后就看不到这个tab了,这样就间接达到了隐藏的目的。 
demo代码如下:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    const int originalTabNum = ui->tabWidget->count();
    const int tabNum = 10;

    for (int i = 0; i < originalTabNum; i++)
    {
        ui->tabWidget->removeTab(0);
    }

    for (int i = 0; i < tabNum; i++)
    {
        ui->tabWidget->addTab(new QWidget(this), QString::number(i));
    }

    ui->comboBox->addItem("13579");
    ui->comboBox->addItem("02468");
    ui->comboBox->addItem("159");
    ui->comboBox->addItem("048");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_comboBox_currentTextChanged(QString text)
{
    const int textLen = text.length();
    const int tabNum = ui->tabWidget->count();
    for (int i = 0; i< tabNum; i++)
    {
        ui->tabWidget->setTabEnabled(i, false);
    }
    for (int i = 0; i < textLen; i++)
    {
        bool ok = false;
        int index = text.mid(i, 1).toInt(&ok);
        if (ok)
        {
            ui->tabWidget->setTabEnabled(index, true);
        }
    }
    /*
     * 似乎由于tab并不是QWidget的缘故,需要每次在对显示的tab进行调整后,调用setStyleSheet使其生效
     */
    ui->tabWidget->setStyleSheet("QTabBar::tab:disabled {width: 0; color: transparent;}");
}
 

在改变QComboBox被选择的item后,会根据当前item的text而显示或隐藏某些tab。先使用setTabEnabled()禁用需要隐藏的tab,然后调用setStyleSheet()将禁用的tab宽度设为0,文字颜色设为透明。 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值