如何在 QTabWidget Stretch 中制作标签以避免滚动

Posted

技术标签:

【中文标题】如何在 QTabWidget Stretch 中制作标签以避免滚动【英文标题】:How to Make Tabs in QTabWidget Stretch to Avoid Scrolling 【发布时间】:2013-06-28 13:46:21 【问题描述】:

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

【问题讨论】:

【参考方案1】:

选项卡小部件非常严格地确保内部的 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));

快!

虽然我会在答案中添加一件事。因为无论它们的显示文本如何,选项卡都被赋予相同的大小,您可能需要确保在 QTabWidget 上设置“elideMode”属性以处理选项卡中没有足够空间来显示整个标题的情况。这将截断文本以适应并添加“...”。

【讨论】:

这行得通。这并不完美,标签总是太大了 1 或 2 个像素,但已经足够接近了。感谢您的帮助:)【参考方案2】:

您需要在选项卡小部件上将 QSizePolicy 设置为 MinimumExpanding,应定义最小尺寸以防止其缩小,同时设置 setWidgetResizable(true)。还要为子控件设置正确的 QSizePolicy 并为选项卡控件定义布局(HBox、VBox、Grid)。

【讨论】:

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

以上是关于如何在 QTabWidget Stretch 中制作标签以避免滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何从 QTabWidget 获取小部件?

如何在 QTabWidget 中添加 QToolBar

在 Qt 中,如何通过 qss 自定义如下 QTabWidget?

如何在 QTabWidget 上显示多光标?

如何识别 QTabWidget 中当前选项卡何时发生变化?

如何确定一个点是不是在 QTabWidget 的 QTabBar 旁边?