QTabWidget 如何只隐藏窗格?

Posted

技术标签:

【中文标题】QTabWidget 如何只隐藏窗格?【英文标题】:QTabWidget how to hide pane only? 【发布时间】:2013-09-27 10:02:47 【问题描述】:

我在QTabWidget 中添加了一个QToolButton 作为角落小部件,这是可以检查的。我想在未选中工具按钮时隐藏所有选项卡(仅限窗格)。我尝试将按钮的信号clicked(bool) 与所有选项卡的setVisible(bool) 插槽连接,但无法正常工作。我还将 tabwidget 的 setvisible 连接到信号,但完整的小部件变得不可见(这是一个愚蠢的试验)。有什么方法可以使仅窗格不可见并且标签栏不会消失?


编辑:代码(用户界面有一个 tabwidget 和两个选项卡,即 tab 和 tab_2)

ui->setupUi(this);
QToolButton * b = new QToolButton;
b->setCheckable(true);
b->setChecked(true);
b->setAutoRaise(true);
b->setText("Hide Tabs");
ui->tabWidget->setCornerWidget(b);
connect(b,SIGNAL(clicked()),ui->tab,SLOT(hide()));
connect(b,SIGNAL(clicked()),ui->tab_2,SLOT(hide()));

【问题讨论】:

前一个实验没有成功是什么意思?您是否在控制台上收到有关连接语法的任何警告?介意粘贴您如何连接它们的代码吗?它应该可以工作,因此我们需要在测试继续时查看您的代码和控制台输出。 能否粘贴相关代码?请参阅 sscee.org。 【参考方案1】:

使用qFindChildQTabWidget 中查找QTabBar

QTabBar *tabBar = qFindChild<QTabBar *>(ui->tabWidget);
tabBar->hide();

对于 Qt5:

QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->hide();

【讨论】:

这对我有用,但是在 Qt5 上你应该使用 ui-&gt;tabWidget-&gt;findChild&lt;QTabBar *&gt;(); 而不是 qFindChild 已弃用【参考方案2】:

所以我这样理解,你想隐藏 TabBar 并让选项卡可见。或者至少这是我从你的问题中得到的

如果是这样的话,你要做的就是这样:

connect(ui->pushButton,SIGNAL(clicked()),ui->tabWidget->tabBar(),SLOT(hide()));

我希望这会有所帮助,即使是做一些老的问题,我虽然它可能会帮助新观众。

【讨论】:

成功隐藏tabBar(在pyqt5中测试)。【参考方案3】:

这是我对此的看法。我创建了一个继承 QTabWidget 的类。我要做的是;将“QTabWidget 的最大垂直尺寸”设置为其tabBars 高度以隐藏面板。

这是一个 hacky 解决方案,我不得不添加一些额外的行来处理怪癖。

文件:hidabletabwidget.h


#ifndef HIDABLETABWIDGET_H
#define HIDABLETABWIDGET_H

#include <QTabWidget>
#include <QAction>

class HidableTabWidget : public QTabWidget

    Q_OBJECT
public:
    explicit HidableTabWidget(QWidget *parent = 0);
    QAction hideAction;

private slots:
    void onHideAction(bool checked);
    void onTabBarClicked();
;

#endif // HIDABLETABWIDGET_H

文件:hidablewidget.cpp


#include "hidabletabwidget.h"
#include <QTabBar>
#include <QToolButton>

HidableTabWidget::HidableTabWidget(QWidget *parent) :
    QTabWidget(parent),
    hideAction("▾", this)

    hideAction.setCheckable(true);
    hideAction.setToolTip("Hide Panels");
    QToolButton* hideButton = new QToolButton();
    hideButton->setDefaultAction(&hideAction);
    hideButton->setAutoRaise(true);
    this->setCornerWidget(hideButton);

    connect(&hideAction, SIGNAL(toggled(bool)), this, SLOT(onHideAction(bool)));
    connect(this, SIGNAL(tabBarClicked(int)), this, SLOT(onTabBarClicked()));


void HidableTabWidget::onHideAction(bool checked)

    if (checked)
    
        this->setMaximumHeight(this->tabBar()->height());
        this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
    
    else
    
        this->setMaximumHeight(QWIDGETSIZE_MAX); // by default widgets can expand to a maximum sized defined by this macro
        this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    


void HidableTabWidget::onTabBarClicked()

    hideAction.setChecked(false);

要使用它,您可以使用 qt 设计器简单地将您的 QTabWidget“提升”为“HidableTabWidget”。

这是它在我的系统上的外观:

【讨论】:

【参考方案4】:

您通常希望从QTabWidget 中删除标签:

void QTabWidget::removeTab ( int index )

删除的标签不会被删除,可以重新插入! 因此,您可以将您的 QToolButton b 连接到一个可以像这样简单地删除选项卡的插槽:

connect( b, SIGNAL(clicked()), this, SLOT(hideTabs() );
..
void Foobar::hideTabs( void )

   for( int i = 0; i < ui->tabWidget->count(); ++i )
      ui->tabWidget->removeTab(i);

【讨论】:

【参考方案5】:

到目前为止,由于我的“声誉”较低,我无法发表评论。如果可以的话,我只想在 Anatoli 的回答中添加评论:目标是隐藏“页面区域”,而不是“标签栏”。因此,如果我们暗示他们总是为此使用 QStackedWidget,那么答案应该更像:

auto * tab_pane = qFindChild<QStackedWidget *>(ui->tabWidget);
tab_pane->hide();

或者对于 Qt5:

auto * tab_pane = ui->tabWidget->findChild<QStackedWidget *>();
tab_pane->hide();

【讨论】:

以上是关于QTabWidget 如何只隐藏窗格?的主要内容,如果未能解决你的问题,请参考以下文章

如何制作没有页面的 QTabWidget

如何在 gtkmm 中隐藏窗格小部件的边框

如何仅隐藏 QTabWidget 栏 PyQt5 [关闭]

如何在 QTabWidget 中隐藏选项卡并在按下按钮时显示它

QTabWidget 我想隐藏子标签

qtabwidget切换tab如何修改