我有QTabWidget
喜欢这个:
但我想将标签扩展为"填充"整个小部件的宽度,如下所示:
我该怎么做?
我正在使用 Qt 5.3.2 和 Qt Creator 3.2.1
更新:
我尝试使用setExpanding
函数:
ui->myTabWidget->tabBar()->setExpanding(true);
但它没有用。
答案 0 :(得分:4)
我发现QTabBar
有一个setExpanding
方法,它似乎完全符合您的要求,但我尝试过(在Windows上),但它并不起作用。这是代码:
ui->tabWidget->tabBar()->setExpanding (true);
然后我找到了以下帖子:
https://forum.qt.io/topic/47404/qtabbar-will-not-expand-its-tabs
我发现上述帖子中提供的答案值得商榷。他说它尊重操作系统风格,无论扩展属性是否设置为true,它是一个功能,而不是一个bug,并且你必须继承QTabBar
来获得所需的行为。如果我编写代码来执行特定的操作,我觉得我的指令应该覆盖操作系统风格。如果我只想要操作系统风格,我会留下特殊代码。无论我多么不同意实施,这似乎是我们一直坚持的。
因此,如果您对此有所了解,那么您需要继承QTabBar
,覆盖tabSizeHint
- 我怀疑这将需要一些实验 - - 并使用QTabWidget::setTabBar
替换您自己的默认值。根据文档,您必须在添加任何选项卡之前执行此操作,因此如果要在Qt Designer中创建选项卡窗口小部件,则此机制不可行。 (支持实施setExpanding
作为操作系统风格的覆盖而不是它的方式的另一个论点。)
答案 1 :(得分:1)
当mostefa回答here时,我可以使用styleSheet为标签设置固定的宽度。
我正在根据QTabWidget
宽度计算宽度。
要正确获得QTabWidget
宽度,我需要在showEvent
函数中获取它:
void LogListForm::showEvent(QShowEvent *ev)
{
/*
* Divide by 2 because we have 2 tabs.
* I need to decrease 24 pixels to fill the width correctly.
*/
int tabWidth = (ui->myTabWidget->width()/2)-24;
/*
* Then, I set this tabWidth to the styleSheet.
* Note: I need to set the previously styleSheet to not lose it
*/
ui->myTabWidget->setStyleSheet( ui->myTabWidget->styleSheet() +
"QTabBar::tab {"
"width: " + QString::number(tabWidth) + "px; }" );
}
答案 2 :(得分:1)
这同样有效:
QTabWidget::tab-bar
{
min-width:1000;
}
答案 3 :(得分:1)
这对我有用:
ui->myTabWidget->tabBar()->setDocumentMode(true);
答案 4 :(得分:0)
// Qt 5.12.2
// just use TabWidget in place of QTabWidget, nothing else
class TabWidget : public QTabWidget
{
class TabBar : public QTabBar
{
QSize _size;
public:
TabBar(QWidget* a_parent) : QTabBar(a_parent)
{
setWidth(size().width());
}
QSize tabSizeHint(int index) const
{
return QSize(_size.width()/(count()?count():1), size().height());
}
void setWidth(int a_width)
{
_size = QSize(a_width, size().height());
QTabBar::resize(_size);
}
};
TabBar* _tabBar = new TabBar(this);
public:
TabWidget(QWidget* a_parent) : QTabWidget(a_parent)
{
setTabBar(_tabBar);
}
void resizeEvent(QResizeEvent *e) override
{
_tabBar->setWidth(size().width());
QTabWidget::resizeEvent(e);
}
};
答案 5 :(得分:0)
来自Mitak的建议奏效。假设Tabwiget位于主窗口的中央小部件中,则可以替换由设计器创建的Tabwidget,如下代码所示:
QTabWidget* newTabWidget = new GeneralTabWidget(ui->tabWidget_ToReplace->parentWidget());
ui->centralWidget->layout()->replaceWidget(ui->tabWidget_ToReplace, newTabWidget );
delete ui->tabWidget_ToReplace;
ui->tabWidget_ToReplace= newTabWidget ;
如果Tabwidget位于其他位置或对话框中,则需要以适当的布局替换它。
答案 6 :(得分:0)
只需将展开模式和文档模式都设置为 true。
ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);
对我有用:)
答案 7 :(得分:0)
不漂亮,但对我有用的是在 minimumSizeHint 覆盖中强制设置值 setExpending。
class A: public QTabWidget
{
A(QWidget *p = nullptr): QTabWidget(p)
{
setDocumentMode(true);
}
virtual QSize minimumSizeHint() const override
{
tabBar()->setExpanding(true);
return QTabWidget::minimumSizeHint();
}
};