You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QMdiArea(TabbedView模式)下QTabBar的setExpanding属性设置问题

解决QMdiArea标签页自动占满宽度的问题

核心思路

QMdiArea在TabbedView模式下内置了QTabBar,但没有直接提供获取该控件的公开接口。可以通过查找子控件的方式获取QTabBar实例,再调用setExpanding(False)关闭标签页的自动扩展特性,让标签只占用自身内容所需宽度。

代码实现

PyQt/PySide 版本

方法1:直接查找子控件

from PyQt5.QtWidgets import QMainWindow, QMdiArea, QMdiSubWindow, QWidget, QTabBar

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.mdi_area = QMdiArea()
        self.mdi_area.setViewMode(QMdiArea.TabbedView)
        self.setCentralWidget(self.mdi_area)

        # 获取QMdiArea内部的QTabBar并关闭自动扩展
        tab_bar = self.mdi_area.findChild(QTabBar)
        if tab_bar:
            tab_bar.setExpanding(False)

        # 添加测试子窗口
        for i in range(5):
            sub_win = QMdiSubWindow()
            sub_win.setWidget(QWidget())
            sub_win.setWindowTitle(f"子窗口 {i+1}")
            self.mdi_area.addSubWindow(sub_win)

方法2:自定义QMdiArea子类(更稳定)

如果直接查找子控件在部分Qt版本中失效,可以子类化QMdiArea,重写方法暴露内部TabBar:

from PyQt5.QtWidgets import QMdiArea, QTabBar

class CustomQMdiArea(QMdiArea):
    def tabBar(self):
        return self.findChild(QTabBar)

# 使用示例
self.mdi_area = CustomQMdiArea()
self.mdi_area.setViewMode(QMdiArea.TabbedView)
tab_bar = self.mdi_area.tabBar()
if tab_bar:
    tab_bar.setExpanding(False)

Qt C++ 版本

#include <QMdiArea>
#include <QTabBar>

// 初始化QMdiArea后执行
QMdiArea *mdiArea = new QMdiArea;
mdiArea->setViewMode(QMdiArea::TabbedView);

QTabBar *tabBar = mdiArea->findChild<QTabBar*>();
if (tabBar) {
    tabBar->setExpanding(false);
}

注意事项

  • 必须在QMdiArea设置为TabbedView模式后再查找QTabBar,否则可能获取不到控件实例。
  • 设置setExpanding(False)后,当标签数量过多时,QMdiArea会自动显示滚动按钮,不会再让所有标签平分整个宽度。

内容的提问来源于stack exchange,提问作者Ajay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 18:13:33