如何在QTabWidget Qt中扩展选项卡

时间:2017-02-15 14:40:37

标签: c++ qt qtabwidget

我有QTabWidget喜欢这个:

enter image description here

但我想将标签扩展为"填充"整个小部件的宽度,如下所示:

enter image description here

我该怎么做?

我正在使用 Qt 5.3.2 Qt Creator 3.2.1

更新

我尝试使用setExpanding函数:

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

但它没有用。

8 个答案:

答案 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);

eddnter image description here

对我有用:)

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