【发布时间】:2011-02-06 16:07:51
【问题描述】:
我正在使用 Qt 完成我的大学作业,我想使用 QTabWidget 来显示一个类似于 Pidgin's 的聊天窗口。我想让“群聊”标签始终打开且无法关闭,而其余的“私人频道”标签可关闭。
QTabWidget 的setTabsClosable(bool) 没有帮助。
有什么想法吗?
【问题讨论】:
标签: c++ qt user-interface tabs
我正在使用 Qt 完成我的大学作业,我想使用 QTabWidget 来显示一个类似于 Pidgin's 的聊天窗口。我想让“群聊”标签始终打开且无法关闭,而其余的“私人频道”标签可关闭。
QTabWidget 的setTabsClosable(bool) 没有帮助。
有什么想法吗?
【问题讨论】:
标签: c++ qt user-interface tabs
我猜你可以处理 tabCloseRequest 信号并决定是否关闭给定的标签
http://doc.qt.io/archives/4.6/qtabwidget.html#tabCloseRequested
编辑:我创建了一个小例子来检查它。我的示例是一个简单的 QtGui 应用程序,其主窗口带有一个 tabwidget。然后我添加了 tabCloseRequested 插槽。这是代码
void MainWindow::on_tabWidget_tabCloseRequested(int index)
{
if(someCondition){
return;
} else if(anotherCondition){
ui->tabWidget->removeTab(index);
}
}
在此示例中,仅关闭条件不适用的选项卡。
【讨论】:
你应该重新实现你的小部件的 event(Event *e) 方法,检查 e 的类型,找出 CloseEvents,当你可以允许标签关闭时调用父类的事件,或者当你不允许时调用 e->ignore()想要。
注意,那么你必须父事件()处理其他事件,所以不要接受(),拒绝()或忘记它们Ж)
【讨论】:
你好,
我想这篇文章对这个帖子的作者没有帮助,但也许其他人在这里徘徊。
在大多数情况下,不可关闭的选项卡不仅应忽略 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);
【讨论】:
None 反而效果很好:TabWidget.tabBar().setTabButton(0, QTabBar.RightSide, None)
虽然 tabBar() 确实受到保护,但 Klaus 指出了正确的方向。只需继承 QTabWidget 并实现一个包装器方法。
【讨论】:
我想我找到了一个更简单的解决方案。 只需访问相关的关闭按钮并调整其大小。
tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->resize(0, 0);
【讨论】:
tabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->hide();
tabButton() 返回一个指针,而不是对象本身。不幸的是,SO 至少需要更改 6 个字符,所以我无法提交修改。
找到栏(它是私有的,所以使用 findChild())并删除按钮。文档声称关闭按钮也可以放在左侧。
QTabBar *tabBar = ui->tabWidget->findChild<QTabBar *>();
tabBar->setTabButton(0, QTabBar::RightSide, 0);
tabBar->setTabButton(0, QTabBar::LeftSide, 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(...));
【讨论】:
不确定,为什么这里没有人提到最简单的工作解决方案:
tabWidget->tabBar()->setTabButton(0, QTabBar::RightSide, 0);
这完全删除了关闭按钮及其占用的空间。 Documentation
【讨论】: