簡體   English   中英

QTabWidget 隱藏和顯示選項卡

[英]QTabWidget Hide and Show tabs

我在使用 QTabWidget 時遇到了一些問題。 如果缺少隱藏功能,我必須自己構建。 根據文檔,我使用 removeTab 和 insertTab,但使用插入選項卡時,我無法顯示已刪除的選項卡頁面。

我用來添加

  RibbonTabContent *ribbonTabContent = new RibbonTabContent;
  QTabWidget::addTab(ribbonTabContent, tabIcon, tabName);

刪除是使用:

void Ribbon::hideTab(const QString &tabName)
{
  // Find ribbon tab
  for (int i = 0; i < count(); i++)
  {
    if (tabText(i).toLower() == tabName.toLower())
    {
       QTabWidget::removeTab(i);
      break;
    }
  }
}

兩個函數都在工作,pWidget 始終為空。 但是現在插入功能不能正常工作。 我認為我有問題,但不明白我的問題。

void Ribbon::showTab(const QString &tabName){

    // Find ribbon tab
    QWidget* pWidget= QTabWidget::findChild<RibbonTabContent *>(tabName);
    if(pWidget){
        QTabWidget::insertTab(2,pWidget, tabName);
    }
}

也許有人可以幫助我?

如果調用QTabWidget::removeTab從您的孩子樹刪除指定索引處的標簽QTabWidget ,標簽實例,實際上不會刪除的,所以當你搜索具有同一標簽QTabWidget::findChild你不能找到因為它不再是你的QTabWidget的孩子了。 從您顯示的代碼中,我認為您可能無論如何都找不到它,因為findChild搜索具有指定objectName的小部件,但您從未為您的選項卡設置它。

一個解決方案是存儲刪除的選項卡,然后在需要時恢復它們。

假設m_hiddenTabsQHash<QString, QWidget*>QMap<QString, QWidget*>你可以嘗試這樣的事情。

void Ribbon::hideTab(const QString &tabName)
{
  // Find ribbon tab
  for (int i = 0; i < count(); i++)
  {
    if (tabText(i).toLower() == tabName.toLower())
    {
       m_hiddenTabs.insert(tabName.toLower(), QTabWidget::widget(i));
       QTabWidget::removeTab(i);
       break;
    }
  }
}

void Ribbon::showTab(const QString &tabName){

    // Find ribbon tab
    auto tab = m_hiddenTabs.take(tabName.toLower());
    if(tab){
        QTabWidget::insertTab(2, tab, tabName);
    }
}

從 Qt 5.15 開始,也可以使用setTabVisible

void QTabWidget::setTabVisible(int index, bool visible)

如果visible 為true,則位置index 處的頁面可見; 否則位置索引處的頁面將被隱藏。 頁面的標簽被適當地重繪。如果visible 為true,則位置index 處的頁面可見; 否則位置索引處的頁面將被隱藏。 頁面的選項卡被適當地重繪。

不幸的是 QTabBar 無法“隱藏”選項卡。

這是我非常簡單的解決方法:將選項卡標記為“已禁用”(例如ui->tabWidget->setTabEnabled(tabIndex, false); )。

然后,使用樣式表將“禁用”選項卡設置為完全不可見且不占用空間:

QTabBar::tab:disabled
{
    min-width: 0px;
    max-width: 0px; 
    color: rgba(0,0,0,0);
    background-color: rgba(0,0,0,0);
}

這對我來說幾乎完美,唯一的缺點是你不能在同一個標​​簽欄中同時使用禁用和“隱藏”標簽。 但是,通常我想要一個或另一個,而不是在同一個酒吧里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM