繁体   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