【问题标题】:Close button only for some tabs in Qt关闭按钮仅适用于 Qt 中的某些选项卡
【发布时间】:2011-02-06 16:07:51
【问题描述】:

我正在使用 Qt 完成我的大学作业,我想使用 QTabWidget 来显示一个类似于 Pidgin's 的聊天窗口。我想让“群聊”标签始终打开且无法关闭,而其余的“私人频道”标签可关闭。

QTabWidgetsetTabsClosable(bool) 没有帮助。

有什么想法吗?

【问题讨论】:

    标签: c++ qt user-interface tabs


    【解决方案1】:

    我猜你可以处理 tabClos​​eRequest 信号并决定是否关闭给定的标签

    http://doc.qt.io/archives/4.6/qtabwidget.html#tabCloseRequested

    编辑:我创建了一个小例子来检查它。我的示例是一个简单的 QtGui 应用程序,其主窗口带有一个 tabwidget。然后我添加了 tabClos​​eRequested 插槽。这是代码

    void MainWindow::on_tabWidget_tabCloseRequested(int index)
    {
       if(someCondition){
           return;
       } else if(anotherCondition){
           ui->tabWidget->removeTab(index);
       }
    }
    

    在此示例中,仅关闭条件不适用的选项卡。

    【讨论】:

    • 不,这不会有帮助,因为当收到信号时,事件已经要完成了,信号不能做任何事情。
    • 我在回复中添加了 tabClos​​eRequest 槽,以阐明如何使用它。
    【解决方案2】:

    你应该重新实现你的小部件的 event(Event *e) 方法,检查 e 的类型,找出 CloseEvents,当你可以允许标签关闭时调用父类的事件,或者当你不允许时调用 e->ignore()想要。

    注意,那么你必须父事件()处理其他事件,所以不要接受(),拒绝()或忘记它们Ж)

    【讨论】:

      【解决方案3】:

      你好,

      我想这篇文章对这个帖子的作者没有帮助,但也许其他人在这里徘徊。

      在大多数情况下,不可关闭的选项卡不仅应忽略 closevent,而且不应在其角落显示关闭符号。达到此目的的一个好方法是修改 QTabWidget 内的 QTabBar。

      例子:

      // let tabWidget be a QTabWidget with at least one page
      
      QPushButton *closeButton = new QPushButton();
      // set icon and size for PushButton, ... 
      // connect Signal clicked() from closeButton with Slot closeCurrentTab(), ...
      
      // next line sets closeButton in right corner on tab with index 0
      tabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, closeButton);
      

      【讨论】:

      • 我在这里徘徊 - 谢谢!它就像一个魅力(在 Python 中): style = QtGui.qApp.style() \ icon = style.standardIcon(style.SP_DockWidgetCloseButton) \ closeButton = QtGui.QPushButton(icon, '') \ closeButton.setStyleSheet('border- style: inset;') self._detailTabs.tabBar().setTabButton(currentTab, QtGui.QTabBar.RightSide, closeButton)
      • 对于其他从 Python 想知道的人,我想完全隐藏按钮,但无法通过设置一个空的 QPushButton 来使其工作。但是通过 None 反而效果很好:TabWidget.tabBar().setTabButton(0, QTabBar.RightSide, None)
      【解决方案4】:

      虽然 tabBar() 确实受到保护,但 Klaus 指出了正确的方向。只需继承 QTabWidget 并实现一个包装器方法。

      【讨论】:

      • BTW QTabWidget::tabBar() 不再受保护
      【解决方案5】:

      我想我找到了一个更简单的解决方案。 只需访问相关的关闭按钮并调整其大小。

      tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);

      【讨论】:

      • 我认为这更容易:tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->hide();
      • 第一种方法更可取,因为它回收了按钮使用的空间。这个问题应该被赞成回答imo。
      • 在 Mac 上使用文档选项卡模式,这将导致运行时错误,因为选项卡按钮在左侧。
      • 答案中有一个错字:tabButton() 返回一个指针,而不是对象本身。不幸的是,SO 至少需要更改 6 个字符,所以我无法提交修改。
      • Even: tabWidget->tabBar()->tabButton(0, QTabBar::RightSide, 0) 删除按钮
      【解决方案6】:

      找到栏(它是私有的,所以使用 findChild())并删除按钮。文档声称关闭按钮也可以放在左侧。

      QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
      tabBar->setTabButton(0, QTabBar::RightSide, 0);
      tabBar->setTabButton(0, QTabBar::LeftSide, 0);
      

      【讨论】:

      • BTW QTabWidget::tabBar() 不再受保护
      【解决方案7】:

      为某些选项卡而不是其他选项卡添加按钮的最佳方法是定义 QTabWidget 的子类以获取受保护的 QTabBar! 下面的代码已经过测试并且可以正常工作:

      //TabWidget.h
      
      #ifndef TABWIDGET_H
      #define TABWIDGET_H
      #include <QTabWidget>
      
      class TabWidget : public QTabWidget {
      public:
          TabWidget(QWidget *parent);
          ~TabWidget();
          QTabBar *tabBar() const;
      };
      #endif  /* TABWIDGET_H */
      
      //TabWidget.cpp
      
      #include "TabWidget.h"
      TabWidget::TabWidget(QWidget * p=0) : QTabWidget(p) {}
      
      TabWidget::~TabWidget() {}
      
      QTabBar * TabWidget::tabBar() const {return QTabWidget::tabBar();}
      

      要使用此子类并使用自定义按钮创建一个新选项卡,您必须遵循以下说明(ui->tabWidget 是一个带有 setClosableTabs=false 的 QTabWidget):

      TabWidget *t = (TabWidget *) ui->tabWidget;
      t->addTab(new QWidget, "empty");
      QTabBar *tab = t->tabBar();
      QPushButton *b = new QPushButton();
      b->setText("x");
      tab->setTabButton(tab->count() -1, QTabBar::RightSide, b);
      connect(b,SIGNAL(...),this,SLOT(...));
      

      【讨论】:

      • BTW QTabWidget::tabBar() 不再受保护
      【解决方案8】:

      不确定,为什么这里没有人提到最简单的工作解决方案:

      tabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, 0);
      

      这完全删除了关闭按钮及其占用的空间。 Documentation

      【讨论】:

        猜你喜欢
        • 2013-11-23
        • 2021-06-09
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        相关资源
        最近更新 更多