QTabBar
有一个 setExpanding
方法,它似乎可以实现你想要的功能,但是我在 Windows 上尝试了一下,它没有起作用。这是代码:ui->tabWidget->tabBar()->setExpanding (true);
然后我找到了以下帖子:
https://forum.qt.io/topic/47404/qtabbar-will-not-expand-its-tabs
我认为上面帖子中提供的答案是有争议的。他说无论是否将expanding属性设置为true,它都遵循操作系统风格,并且这是一种特性而不是错误,并且您必须对QTabBar进行子类化以获得所需的行为。如果我编写代码来执行特定任务,我觉得我的指令应该覆盖操作系统风格。如果我只想要操作系统风格,我会省略那些特殊代码。无论我多么不同意实现方式,似乎这就是我们所困扰的。QTabWidget::tab-bar
{
min-width:1000;
}
正如 mostefa 在这里所回答的那样,我可以使用 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; }" );
}
// 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);
}
};
this worked for me:
ui->myTabWidget->tabBar()->setDocumentMode(true);
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位于另一个位置或对话框中,则需要在适当的布局中替换它。
不太美观,但对我有效的方法是在 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();
}
};