【问题标题】:How to deselect all tabs in QTabBar?如何取消选择 QTabBar 中的所有选项卡?
【发布时间】:2021-09-19 14:05:20
【问题描述】:

有没有办法取消选择 QTabBar 的所有选项卡?在文档中它读起来有些含糊:

如果没有当前选项卡,则当前索引为 -1。

但是将当前索引设置为-1似乎并没有取消选择所有选项卡的效果。

我的用例是我有标签栏驱动的工具栏。我还实现了再次单击当前选项卡选项卡时隐藏所有工具栏的功能。但是,我似乎无法获得显示未选择选项卡的相应视觉效果。

【问题讨论】:

  • 您是否使用 setter: QTabBar::setCurrentIndex(int index) 设置 -1 值?
  • @Nikxp 是的,我试过了。

标签: qt tabbar


【解决方案1】:

看来我找到了解决方案。一个隐形的假标签可以解决问题。在 Linux 和 Mac 上使用 Qt 6.1.3 进行测试。不确定 Qt5。

const auto fakeTabIndex = tabBar->addTab(QString());
tabBar->setTabVisible(fakeTabIndex, false);
....
tabBar->setCurrentIndex(fakeTabIndex);

【讨论】:

  • 太好了,这实际上似乎有效。很抱歉反应迟缓。并且至少也适用于 5.15.2。
【解决方案2】:

请参阅 Nikolay 的答案以了解(棘手的)解决方法。

恐怕这目前是不可能的。 currentIndex 只能是 -1 在没有启用的选项卡项时。

虽然文档中没有明确提到,但是源码还是很清楚的:

bool validIndex(int index) const { return index >= 0 && index < tabList.count(); }

void QTabBar::setCurrentIndex(int index)
{
    Q_D(QTabBar);
    if (d->dragInProgress && d->pressedIndex != -1)
        return;
    int oldIndex = d->currentIndex;
    if (d->validIndex(index) && d->currentIndex != index) {
        ...
    }
}

一个(棘手的)解决方法可能是禁用所有选项卡项并在用户单击它时再次启用它们。

【讨论】:

  • 谢谢,这很有帮助。不幸的是,禁用不是选项,因为它表明无法单击选项卡。至少我会尝试提交错误/增强报告。
  • @Daniel 如果您自己捕捉到点击事件,您也许可以启用标签 JIT。提交功能是个好主意,但恐怕不会很快处理。自己添加一个补丁可能会加快这个过程。
  • 我没有收到关于再次启用的评论。这将使选项卡再次显示为选中状态。
  • @Daniel 在用户点击标签的那一刻,这不是你想要的吗?
  • 用户点击一个已经选择的标签,这应该使它进入没有标签被选择的状态。只有在用户再次单击选项卡后才会再次更改。 (想一想:MS Word 中的 Ribbon。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
相关资源
最近更新 更多