QTabWidget 如何仅隐藏窗格?

问题描述 投票:0回答:6

我在

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


编辑:代码(ui 有一个 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()));
qt qt4 qtabwidget
6个回答
3
投票

使用

qFindChild
查找
QTabBar
中的
QTabWidget

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

对于 Qt5:

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

3
投票

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

如果是这种情况,你所要做的就是这样:

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

我希望这对你有帮助,即使是用有点旧的方式做问题,我想这可能会对新观众有所帮助。


3
投票

这是我对此的看法。我创建了一个继承 QTabWidget 的类。我所做的是;将“QTabWidget 的最大垂直尺寸”设置为其

tabBar
的高度以隐藏面板。

这是一个 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”即可。

这是它在我的系统上的样子:


0
投票

您通常希望从 QTabWidget 中删除选项卡:

void QTabWidget::removeTab ( int index )

被移除的Tab不会被删除,可以重新插入! 因此,您可以将

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);
}

0
投票

由于迄今为止我的“声誉”较低,我无法发表评论。如果可以的话,我只想在阿纳托利的答案中添加一条评论:目标是隐藏“页面区域”,而不是“选项卡栏”。因此,如果我们暗示他们总是使用 QStackedWidget 那么答案应该更像是:

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

或者对于 Qt5:

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

0
投票

我还无法发表评论,我只想补充一点,@HeyYO 的技巧有效,并且是我能找到使其发挥作用的唯一方法。

我想补充一点,在我的示例中,我希望在“隐藏按钮”的放置位置以及它应该是什么样子方面具有更大的灵活性。

为此,您可能需要一些布局。将您的布局包装在 QWidget 中以允许更改大小设置,然后执行与 @HeyYO 相同的技巧,设置布局小部件的最大高度。

这是“隐藏按钮”的 Python 代码:

@QtCore.pyqtSlot()
def on_settingsToggleButton_clicked(self):
    if self.settingsToggled:
        self.settingToggleContext = { 'max_height': self.settingsHlay.maximumHeight() }
        self.settingsHlay.setMaximumHeight(self.settingTabs.tabBar().height())
        self.settingsToggleButton.setIcon(up_icon)
    else:
        self.settingsHlay.setMaximumHeight(self.settingToggleContext['max_height'])
        self.settingsToggleButton.setIcon(down_icon)

    self.settingsToggled = not self.settingsToggled

这是我的 Qt Designer 及其外观

© www.soinside.com 2019 - 2024. All rights reserved.