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

C++ 关闭按钮仅适用于Qt中的某些选项卡,c++,qt,user-interface,tabs,C++,Qt,User Interface,Tabs,我正在使用Qt完成一项大学作业,我想使用QTabWidget来显示一个聊天窗口,就像这样。我想让“群聊”选项卡始终打开且不可能关闭,其余的“私人频道”选项卡可关闭 QTabWidget的setTabsClosable(bool)没有帮助 有什么想法吗?我想您可以处理tabCloseRequest信号并决定是否关闭给定的选项卡 编辑:我创建了一个小示例来检查它。我的示例是一个简单的QtGui应用程序,它有一个带有tabwidget的主窗口。然后我添加了所请求的插槽。这是密码 void MainW

我正在使用Qt完成一项大学作业,我想使用
QTabWidget
来显示一个聊天窗口,就像这样。我想让“群聊”选项卡始终打开且不可能关闭,其余的“私人频道”选项卡可关闭

QTabWidget
setTabsClosable(bool)
没有帮助


有什么想法吗?

我想您可以处理tabCloseRequest信号并决定是否关闭给定的选项卡

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

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

在此示例中,只有条件不适用的选项卡才会关闭。

您应该重新实现小部件的事件(event*e)方法,检查e的类型,找出CloseEvents,并在允许关闭选项卡时调用父类的事件,或者在不需要时调用e->ignore()

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

Hallo

我猜这篇文章对这篇文章的作者没有帮助,但也许有人在这里闲逛

在大多数情况下,不可关闭的选项卡不仅应忽略CloseEvent,而且不应在其角落显示close符号。实现这一点的一个好方法是修改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);

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

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

tabWidget->tabBar()->tabButton(0,QTabBar::RightSide)->调整大小(0,0)

找到该栏(它是私有的,因此使用findChild())并移除按钮。文件声称关闭按钮也可以放在左侧

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

将按钮添加到某些选项卡(而不是其他选项卡)的最佳方法是定义QTabWidget的子类,以获取作为选项的QTABAR! 下面的代码经过测试,可以正常工作:

//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();}

不,这不会有帮助,因为当接收到信号时,事件已经完成,信号不能做任何事情。我在响应中添加了tabCloseRequest插槽,以澄清如何使用它。我认为这更容易:
tabWidget->tabBar()->tabButton(0,QTabBar::RightSide)->hide()第一种方法更可取,因为它可以回收按钮使用的空间。回答imo时,应将此问题向上投票。在使用文档选项卡模式的Mac上,这将导致运行时错误,因为选项卡按钮位于左侧。答案中有一个拼写错误:
tabButton()
返回指针,而不是对象本身。不幸的是,SO要求至少更改6个字符,因此我无法提交编辑。甚至:tabWidget->tabBar()->tabButton(0,QTabBar::RightSide,0)删除了我在此处漫游的按钮-谢谢!它就像一个符咒(在Python中):style=QtGui.qApp.style()\icon=style.standardIcon(style.SP\u DockWidgetCloseButton)\closeButton=QtGui.QPushButton(icon',)\closeButton.setStyleSheet('border-style:inset;')self.\u detailTabs.tabBar().setTabButton(currentTab,QtGui.QTabBar.right,closeButton)BTW QTabWidget::tabBar()不再受保护BTW QTabWidget::tabBar()不再受保护BTW QTabWidget::tabBar()不再受保护
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(...));