QTabWidget, как скрыть только панель?

Я добавил QToolButton угловой виджет в QTabWidget, который можно проверить. Я хочу скрыть все вкладки (только панели), когда кнопка инструмента не отмечена. Я пытался подключить сигнал кнопки clicked(bool) со слотом setVisible(bool) всех вкладок, но он не работал. Я также подключил setvisible tabwidget к сигналу, но весь виджет стал невидимым (это был глупый эксперимент). Есть ли способ сделать невидимой только панель, а панель вкладок не исчезнет?


Изменить: код (пользовательский интерфейс имеет виджет вкладок и две вкладки, а именно вкладку и вкладку_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()));

person Tab    schedule 27.09.2013    source источник
comment
Что вы имеете в виду под прежним экспериментом, что он не сработал? Вы получили какое-либо предупреждение на консоли о синтаксисе подключения? Не могли бы вы вставить код, как вы их соединили? Это должно работать, поэтому нам нужно будет увидеть ваш код и вывод консоли при продолжении тестирования.   -  person lpapp    schedule 28.09.2013
comment
Не могли бы вы вставить соответствующий код? Обратитесь к sscee.org для этого.   -  person lpapp    schedule 28.09.2013


Ответы (5)


Используйте qFindChild, чтобы найти QTabBar в QTabWidget:

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

Для Qt5:

QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->hide();
person Anatoli    schedule 25.04.2014
comment
Это сработало для меня, однако в Qt5 вы должны использовать ui->tabWidget->findChild<QTabBar *>(); вместо qFindChild, который устарел. - person Zharf; 27.11.2014

так что я понимаю это так, вы хотите скрыть TabBar и сделать вкладку видимой. По крайней мере, это то, что я понял из вашего вопроса.

Ну, если это так, все, что вам нужно сделать, это:

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

Я надеюсь, что это было полезно, даже вопросы в немного старом, я, хотя это может помочь новым зрителям.

person SujaM    schedule 16.12.2015
comment
Успешно скрывает tabBar (проверено в pyqt5). - person Sahil Jain; 19.03.2018

Вот мой взгляд на это. Я создал класс, наследующий QTabWidget. Что я делаю; установите максимальный вертикальный размер QTabWidget на его высоту tabBars, чтобы скрыть панели.

Это хакерское решение, и мне пришлось добавить несколько дополнительных строк, чтобы справиться с причудами.

файл: 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);
}

Чтобы использовать это, вы можете просто повысить свой QTabWidget до HidableTabWidget с помощью дизайнера qt.

А вот как это выглядит в моей системе:

показ скрытого виджета и скриншот скрытых состояний

person HeyYO    schedule 30.07.2015

Обычно вы хотите удалить вкладку из 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);
}
person Teh Suu    schedule 01.10.2013

Пока не могу комментировать из-за своей низкой "репутации". Если бы я мог, я бы просто добавил комментарий к ответу Анатолия: цель состоит в том, чтобы скрыть «область страницы», а не «панель вкладок». Итак, если мы подразумеваем, что они всегда используют для этого QStackedWidget, тогда ответ должен быть больше похож на:

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

или для Qt5:

auto * tab_pane = ui->tabWidget->findChild<QStackedWidget *>();
tab_pane->hide();
person topoden    schedule 13.09.2015