如何在QTabWidget Qt中展开标签页
How to expand tabs in QTabWidget Qt
我有一个像这样的QTabWidget
:
但我想将选项卡扩展到 "fill" 整个小部件宽度,如下所示:
我该怎么做?
我正在使用 Qt 5.3.2 和 Qt Creator 3.2.1
更新:
我尝试使用 setExpanding
函数:
ui->myTabWidget->tabBar()->setExpanding(true);
但是没有用。
我发现 QTabBar
有一个 setExpanding
方法,它似乎完全符合您的要求,但我试过了(在 Windows 上),但它不起作用.这是代码:
ui->tabWidget->tabBar()->setExpanding (true);
然后我发现了以下post:
https://forum.qt.io/topic/47404/qtabbar-will-not-expand-its-tabs
我发现上面 post 中提供的答案值得商榷。他说,无论扩展 属性 是否设置为 true,这都是对操作系统风格的尊重,它是一个功能,而不是错误,您必须子类化 QTabBar
才能获得所需的行为。如果我编写代码来做特定的事情,我觉得我的指令应该覆盖 OS 样式。如果我只想要 OS 样式,我会省略那个特殊代码。无论我多么不同意实施,这似乎是我们坚持的。
因此,如果拥有这种外观对您很重要,那么您需要子类化 QTabBar
,覆盖 tabSizeHint
——我怀疑这需要一些实验——并使用 QTabWidget::setTabBar
将默认值替换为您自己的。根据文档,您必须在添加任何选项卡之前执行此操作,因此如果您想在 Qt Designer 中创建选项卡小部件,则此机制不可行。 (另一个支持将 setExpanding
实现为对 OS 样式的覆盖而不是它已经完成的方式的论点。)
正如 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; }" );
}
这也有效:
QTabWidget::tab-bar
{
min-width:1000;
}
// 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);
}
};
Mitak 的建议奏效了。假设 tabwiget 在主窗口的 centralwidget 中,可以替换使用设计器创建的 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 ;
如果选项卡小部件位于其他位置或对话框中,则需要将其替换为适当的布局。
只需将展开模式和文档模式都设置为 true。
ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);
适合我:)
不太好,但对我有用的是在 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();
}
};
这对我有用:
ui->myTabWidget->tabBar()->setDocumentMode(true);
我有一个像这样的QTabWidget
:
但我想将选项卡扩展到 "fill" 整个小部件宽度,如下所示:
我该怎么做?
我正在使用 Qt 5.3.2 和 Qt Creator 3.2.1
更新:
我尝试使用 setExpanding
函数:
ui->myTabWidget->tabBar()->setExpanding(true);
但是没有用。
我发现 QTabBar
有一个 setExpanding
方法,它似乎完全符合您的要求,但我试过了(在 Windows 上),但它不起作用.这是代码:
ui->tabWidget->tabBar()->setExpanding (true);
然后我发现了以下post:
https://forum.qt.io/topic/47404/qtabbar-will-not-expand-its-tabs
我发现上面 post 中提供的答案值得商榷。他说,无论扩展 属性 是否设置为 true,这都是对操作系统风格的尊重,它是一个功能,而不是错误,您必须子类化 QTabBar
才能获得所需的行为。如果我编写代码来做特定的事情,我觉得我的指令应该覆盖 OS 样式。如果我只想要 OS 样式,我会省略那个特殊代码。无论我多么不同意实施,这似乎是我们坚持的。
因此,如果拥有这种外观对您很重要,那么您需要子类化 QTabBar
,覆盖 tabSizeHint
——我怀疑这需要一些实验——并使用 QTabWidget::setTabBar
将默认值替换为您自己的。根据文档,您必须在添加任何选项卡之前执行此操作,因此如果您想在 Qt Designer 中创建选项卡小部件,则此机制不可行。 (另一个支持将 setExpanding
实现为对 OS 样式的覆盖而不是它已经完成的方式的论点。)
正如 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; }" );
}
这也有效:
QTabWidget::tab-bar
{
min-width:1000;
}
// 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);
}
};
Mitak 的建议奏效了。假设 tabwiget 在主窗口的 centralwidget 中,可以替换使用设计器创建的 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 ;
如果选项卡小部件位于其他位置或对话框中,则需要将其替换为适当的布局。
只需将展开模式和文档模式都设置为 true。
ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);
适合我:)
不太好,但对我有用的是在 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();
}
};
这对我有用:
ui->myTabWidget->tabBar()->setDocumentMode(true);