关闭按钮仅适用于Qt中的某些选项卡

时间:2010-04-11 08:42:46

标签: c++ qt user-interface tabs

我正在使用Qt进行大学的作业,我希望使用QTabWidget来显示与Pidgin's非常相似的聊天窗口。我想让“群聊”标签始终打开,无法关闭,其余的“私人频道”标签可以关闭。

QTabWidget的{​​{1}}没有帮助。

有什么想法吗?

7 个答案:

答案 0 :(得分:33)

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

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

答案 1 :(得分:16)

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

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

答案 2 :(得分:9)

喂,

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

在大多数情况下,不可关闭的标签不仅应该忽略它,也不应该在它的角落显示一个紧密的符号。达到此目的的一个好方法是修改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);

答案 3 :(得分:4)

尽管tabBar()确实受到保护,但Klaus指出了正确的方向。只需将QTabWidget子类化并实现包装器方法。

答案 4 :(得分: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);
   }
}

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

答案 5 :(得分:1)

你应该重新实现你的小部件的事件(Event * e)方法,检查e的类型,找出CloseEvents,并在你可以允许tab关闭时调用parent class的事件,或者当你做的时候e-&gt; ignore()不想要它。

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

答案 6 :(得分:0)

将按钮添加到某些选项卡而不是其他选项卡的最佳方法是定义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(...));