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
相关产品推荐
相关产品推荐

