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】:使用qFindChild
在QTabWidget
中查找QTabBar
:
QTabBar *tabBar = qFindChild<QTabBar *>(ui->tabWidget);
tabBar->hide();
对于 Qt5:
QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->hide();
【讨论】:
这对我有用,但是在 Qt5 上你应该使用ui->tabWidget->findChild<QTabBar *>();
而不是 qFindChild
已弃用【参考方案2】:
所以我这样理解,你想隐藏 TabBar 并让选项卡可见。或者至少这是我从你的问题中得到的
如果是这样的话,你要做的就是这样:
connect(ui->pushButton,SIGNAL(clicked()),ui->tabWidget->tabBar(),SLOT(hide()));
我希望这会有所帮助,即使是做一些老的问题,我虽然它可能会帮助新观众。
【讨论】:
成功隐藏tabBar(在pyqt5中测试)。【参考方案3】:这是我对此的看法。我创建了一个继承 QTabWidget 的类。我要做的是;将“QTabWidget 的最大垂直尺寸”设置为其tabBar
s 高度以隐藏面板。
这是一个 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 如何只隐藏窗格?的主要内容,如果未能解决你的问题,请参考以下文章