如何在QTabWidget Qt中展开标签页

How to expand tabs in QTabWidget Qt

我有一个像这样的QTabWidget

但我想将选项卡扩展到 "fill" 整个小部件宽度,如下所示:

我该怎么做?

我正在使用 Qt 5.3.2Qt 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);