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