如何在Qt的QTabWidget中展开选项卡

6
我有一个像这样的:

enter image description here

但我想扩展选项卡以“填充”整个窗口宽度,就像这样:

enter image description here

我该怎么做?

我正在使用Qt 5.3.2Qt Creator 3.2.1


更新

我尝试使用setExpanding函数:

ui->myTabWidget->tabBar()->setExpanding(true);

但是它没有起作用。
8个回答

7

只需将扩展模式和文档模式都设置为true。

ui->tabWidget->tabBar()->setDocumentMode(true);
ui->tabWidget->tabBar()->setExpanding(true);

这里是eddnter的图片描述

对我有效 :)


这段代码在我的Ubuntu上运行良好!不需要覆盖任何东西! - dridk

6
我发现 QTabBar 有一个 setExpanding 方法,它似乎可以实现你想要的功能,但是我在 Windows 上尝试了一下,它没有起作用。这是代码:
ui->tabWidget->tabBar()->setExpanding (true);

然后我找到了以下帖子:

https://forum.qt.io/topic/47404/qtabbar-will-not-expand-its-tabs

我认为上面帖子中提供的答案是有争议的。他说无论是否将expanding属性设置为true,它都遵循操作系统风格,并且这是一种特性而不是错误,并且您必须对QTabBar进行子类化以获得所需的行为。如果我编写代码来执行特定任务,我觉得我的指令应该覆盖操作系统风格。如果我只想要操作系统风格,我会省略那些特殊代码。无论我多么不同意实现方式,似乎这就是我们所困扰的。
因此,如果您重视这个外观,则需要对QTabBar进行子类化,覆盖tabSizeHint - 我怀疑这需要一些尝试 - 并使用QTabWidget :: setTabBar将默认选项卡替换为自己的选项卡。根据文档,在添加任何选项卡之前必须这样做,因此如果您想在Qt Designer中创建选项卡窗口小部件,则此机制无法使用。(另一个支持将setExpanding实现为覆盖操作系统风格而不是已完成方式的论点。)

谢谢,@goug,我需要测量一下是否真的有必要,因为实现起来似乎很痛苦。我真的希望有更简单的方法来做这件事。 - KelvinS
我完全同意你的看法。我在Qt Designer中做了很多表单工作,如果我必须按照你所要求的方式去做,那么直接编辑表单比在代码中创建所有选项卡表单要昂贵得多。 - goug
我找到了一个更简单的解决方案,它起作用了。也许这不是最好的方法,但它非常有效。请看我的答案。 - KelvinS

2
这也可以工作:

QTabWidget::tab-bar
{
    min-width:1000;
}

2
正文如下:

正如 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; }" );
}

1
我喜欢这种方法。它非常简单;你可能会遇到的唯一问题是硬编码调整或24像素的宽度使用。这可能会因操作系统而异,也可能因用户设置而异,但我不知道你能否对此做出任何改变。很好的发现。 - goug

2
// 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);
    }
};

1

this worked for me:

ui->myTabWidget->tabBar()->setDocumentMode(true);

0
Mitak的建议起作用了。假设tabwiget位于mainwindow的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 ;

如果TabWidget位于另一个位置或对话框中,则需要在适当的布局中替换它。


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();
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接