我在
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()));
使用
qFindChild
查找 QTabBar
中的 QTabWidget
:
QTabBar *tabBar = qFindChild<QTabBar *>(ui->tabWidget);
tabBar->hide();
对于 Qt5:
QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->hide();
所以我是这样理解的,你想隐藏TabBar并让选项卡可见。或者至少这就是我从你的问题中得到的
如果是这种情况,你所要做的就是这样:
connect(ui->pushButton,SIGNAL(clicked()),ui->tabWidget->tabBar(),SLOT(hide()));
我希望这对你有帮助,即使是用有点旧的方式做问题,我想这可能会对新观众有所帮助。
这是我对此的看法。我创建了一个继承 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”即可。
这是它在我的系统上的样子:
您通常希望从 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);
}
由于迄今为止我的“声誉”较低,我无法发表评论。如果可以的话,我只想在阿纳托利的答案中添加一条评论:目标是隐藏“页面区域”,而不是“选项卡栏”。因此,如果我们暗示他们总是使用 QStackedWidget 那么答案应该更像是:
auto * tab_pane = qFindChild<QStackedWidget *>(ui->tabWidget);
tab_pane->hide();
或者对于 Qt5:
auto * tab_pane = ui->tabWidget->findChild<QStackedWidget *>();
tab_pane->hide();
我还无法发表评论,我只想补充一点,@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