2013-06-28 27 views
0

我有一个QTabWidget有几个固定大小的选项卡。我希望将标签小部件放置在布局中以使其与主窗口一起展开,但是当我缩小标签的右侧时会在标签右侧显示滚动条,或者在我拉伸时在标签右侧留出空白空间出来。我希望标签自动填充整个QTabWidget。如何使QTabWidget拉伸以避免滚动

enter image description here

回答

3

选项卡小部件非常严格地确保QTabBar内部是以最小尺寸创建的。但是,一切都不会丢失。

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

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

建议的做法是使用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!

虽然有一件事我会添加到答案。由于无论显示文本如何,制表符的大小都相同,因此可能需要确保在QTabWidget上设置“elideMode”属性,以处理标签中没有足够空间显示整个标题的情况。这将截断文本以适合并添加“...”。

+0

这工作。这并不完美,标签总是1或2像素太大,但它足够接近。谢谢您的帮助 :) – sj755

0

您需要将您的QSizePolicy设置为MinimumExpanding你的标签,窗口小部件,最小尺寸应定义为防止其萎缩,还设置setWidgetResizable(真)。还要为子窗口小部件设置正确的QSizePolicy,并为Tab窗口小部件定义一个布局(HBox,VBox,Grid)。

+0

我添加了布局,设置了大小策略,虽然QTabWidget自己调整大小,但这些选项卡本身保持不变的最小大小。我用红色突出显示的区域是我试图水平拉伸的区域。任何想法。 – sj755