1

我添加了一个可检查的QToolButton角小部件QTabWidget。我想在未选中工具按钮时隐藏所有选项卡(仅限窗格)。我试图将按钮的信号连接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()));
4

5 回答 5

3

用于在qFindChild中查找:QTabBarQTabWidget

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

对于 Qt5:

QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->hide();
于 2014-04-25T07:23:19.310 回答
3

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

好吧,如果是这种情况,您所要做的就是:

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

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

于 2015-12-16T17:11:58.470 回答
2

这是我对此的看法。我创建了一个继承 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("▾&quot;, 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”。

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

显示的隐藏小部件和隐藏状态截图

于 2015-07-30T14:21:50.627 回答
0

您通常希望从QTabWidget中删除 Tab :

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);
}
于 2013-10-01T07:16:58.393 回答
0

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

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

或者对于 Qt5:

auto * tab_pane = ui->tabWidget->findChild<QStackedWidget *>();
tab_pane->hide();
于 2015-09-13T21:25:29.110 回答