仅在 QTabWidget 的活动选项卡上关闭按钮

Posted

技术标签:

【中文标题】仅在 QTabWidget 的活动选项卡上关闭按钮【英文标题】:Close button only on active tab of QTabWidget 【发布时间】:2016-10-03 00:29:02 【问题描述】:

为了节省QTabWidget 中的空间,我想仅为当前选项卡显示关闭图标,例如Firefox 正在做:

有没有一种使用样式表的简单方法,比如(不是这样工作)

QTabBar::tab::!selected::close-button visible: false;

还是我必须继承 QTabWidget 才能获得所需的行为?

【问题讨论】:

【参考方案1】:

您不需要继承任何东西,您可以使用QTabWidget::tabBar() 方法来获取与您的QTabWidget 关联的标签栏的引用(即QTabBar *)。 (注意这个方法不再受保护,所以不用子类化也可以访问)

QTabBar *tabBar = tabWidget->tabBar();

您现在可以使用tabBar 引用来隐藏非当前选项卡上的关闭按钮。例如隐藏ith 按钮,你可以这样做:

tabBar->tabButton(i, QTabBar::RightSide)->hide();

所以一个简单的工作流程可以如下:

QTabWidget::currentChanged(int index) 信号连接到插槽。 在该插槽中隐藏除index 处的按钮以外的所有关闭按钮。

【讨论】:

谢谢。事实上,我可以让按钮消失。但是,这不会修改选项卡宽度。选项卡中只有一些空白区域:i.imgur.com/7yO4Cmi.png。知道如何回收该空间吗?【参考方案2】:

您可以使用受保护的方法QTabWidget::tabBar 子类化QTabWidget 以访问QTabBar 小部件。然后您可以连接到QTabBar::currentChanged 信号并手动隐藏未选中标签的关闭按钮:

QTabBar::ButtonPosition closeSide =
        (QTabBar::ButtonPosition)style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, 0, this);

for (int i = 0; i < toolbar->count(); ++i)

    if (i != toolbar->currentIndex())
    
        QWidget *w = toolbar->tabButton(i, closeSide);
        w->hide();
    

【讨论】:

QTabWidget::tabBar 不再受到保护 在 Qt 4.8 中是这样的。【参考方案3】:

hide() 为不可见的关闭按钮留下空白空间。这看起来很有趣。 改为将宽度设置为 0。

【讨论】:

以上是关于仅在 QTabWidget 的活动选项卡上关闭按钮的主要内容,如果未能解决你的问题,请参考以下文章

QTabWidget 在选项卡上设置掩码(不是选项卡内容)

Pyqt 关闭未选中的选项卡

脚本无法在非活动选项卡上运行

带有动态变化小部件的 QTabWidget

尽管调用了 show(),但插入的选项卡未在 QTabWidget 中显示

Python:如何从 QTabWidget 查询当前选项卡