如何在QTabWidget Stretch中制作选项卡以避免滚动

时间:2013-06-28 13:46:21

标签: c++ qt user-interface tabs qtabwidget

我有一个QTabWidget,其中包含一些固定大小的标签。我想将tab小部件放在一个布局中,使其与主窗口一起拉伸,但是当我缩小时,这会导致滚动条出现在选项卡的右侧,或者当我拉伸时,会导致选项卡右侧的空白区域出来。我希望标签能够自动填充QTabWidget的整个长度。

enter image description here

2 个答案:

答案 0 :(得分:3)

Tab小部件非常严格地确保使用最小大小创建QTabBar内部。但是,一切都不会丢失。

因为我们可以访问QTabBar及其中的标签,所以我们可以做些什么。我发现以下answer 提出了一个简单的解决方法。

基本上使用样式表我们根据选项卡小部件的当前宽度设置选项卡的宽度。然后,诀窍是确保如果tab小部件的宽度发生变化,我们会重新进行此计算。

建议的方法是使用EventFilter。基本上所需要的只是以下课程:

// On resize events, reapply the expanding tabs style sheet
class ResizeFilter : public QObject
{
    QTabWidget *target;
public:
    ResizeFilter(QTabWidget *target) : QObject(target), target(target) {}

    bool eventFilter(QObject *object, QEvent *event)
    {
        if (event->type() == QEvent::Resize)
        {
            // The width of each tab is the width of the tab widget / # of tabs.
            target->setStyleSheet(QString("QTabBar::tab { width: %1px; } ")
                      .arg(target->size().width()/target->count()));
        }
        return false;
    }
};

然后,对于您的特定QTabWidget,只需安装事件处理程序:

ui.tabWidget->installEventFilter(new ResizeFilter(ui.tabWidget));

的Presto!

虽然有一件事我会加入答案。由于选项卡的大小与显示文本无关,因此您可能需要确保设置" elideMode" QTabWidget上的属性,用于处理选项卡中没有足够空间显示整个标题的情况。这将截断文本以适应并添加" ..."。

答案 1 :(得分:0)

您需要在Tab-widget上将QSizePolicy设置为MinimumExpanding,应定义最小大小以防止缩小,同时设置setWidgetResizable(true)。还为子窗口小部件设置了正确的QSizePolicy,并为选项卡窗口小部件定义了布局(HBox,VBox,Grid)。