2013-09-27 68 views
0

我已在QTabWidget中添加了一個QToolButton作爲可檢查的角部件。當工具按鈕未選中時,我想要隱藏所有選項卡(僅限於窗格)。我試圖連接按鈕的信號clicked(bool)與所有標籤的setVisible(bool)插槽不工作,但。我還將tabwidget的setvisible連接到信號上,但完成的部件變得看不見(這是一個愚蠢的嘗試)。有什麼辦法讓只有窗格不可見,並且標籤欄不會消失嗎?QTabWidget如何只隱藏窗格?


編輯:代碼(UI有tabwidget和兩個標籤,即標籤和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())); 
+0

對於之前的實驗來說,它不起作用的含義是什麼?您是否在控制檯上收到關於連接語法的警告?記住你如何連接它們的代碼?它應該可以工作,所以當測試繼續時,我們需要看到你的代碼和控制檯輸出。 – lpapp

+0

你能否粘貼相關的代碼?請參閱sscee.org。 – lpapp

回答

0

通常你想從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); 
} 
+0

窗格仍然存在 – Tab

2

使用qFindChild內找到了QTabWidgetQTabBar

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

對於QT5:

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

這對我有用,但是在Qt5上,您應該使用'ui-> tabWidget-> findChild ();'而不是已棄用的'qFindChild' – Zharf

+0

對於Qt5更新。 – Anatoli

1

這是我對此的看法。我創建了一個繼承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(100000); // just a very big number 
     this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 
    } 
} 

void HidableTabWidget::onTabBarClicked() 
{ 
    hideAction.setChecked(false); 
} 

要使用此,你可以簡單地 「提升」 您QTabWidget到「HidableTabWidget」使用qt設計器。

這裏是它的外觀我的系統上:

hidable widget shown and hidden states screenshot

0

我不能發表評論,由於我低「信譽」爲止。如果我可以的話,我只是給Anatoli的回答添加評論:目標是隱藏「頁面區域」,而不是「標籤欄」。因此,如果我們意味着他們總是用QStackedWidget對於那麼答案應該更像:

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

或QT5:

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

所以我的理解是這樣的,你要隱藏的TabBar和讓選項卡可見。或者說,至少這是我從你的問題得到

那麼如果該情況下,所有你需要做的是這樣的:

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

我希望這是有幫助的,甚至做一老一少的問題,我儘管它可以幫助新觀衆。