QTabWidget, like QStackedWidget, uses QStackedLayout, which always has a minimum size hint computed using the minimum size hint of all of its widgets.
In order to prevent that, both sizeHint()
and minimumSizeHint()
should be reimplemented, and updateGeometry()
should be called whenever the index changes.
In the following example I've unified the two functions, converted from :sizeHint()
of QTabWidget, but in order to provide correct implementation, the original :minimumSizeHint()
implementation should be adapted too.
class TabWidget(QTabWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.currentChanged.connect(self.updateGeometry)
def minimumSizeHint(self):
return self.sizeHint()
def sizeHint(self):
lc = QSize(0, 0)
rc = QSize(0, 0)
opt = QStyleOptionTabWidgetFrame()
self.initStyleOption(opt)
if self.cornerWidget(Qt.TopLeftCorner):
lc = self.cornerWidget(Qt.TopLeftCorner).sizeHint()
if self.cornerWidget(Qt.TopRightCorner):
rc = self.cornerWidget(Qt.TopRightCorner).sizeHint()
layout = self.findChild(QStackedLayout)
layoutHint = layout.currentWidget().sizeHint()
tabHint = self.tabBar().sizeHint()
if self.tabPosition() in (self.North, self.South):
size = QSize(
max(layoutHint.width(), tabHint.width() + rc.width() + lc.width()),
layoutHint.height() + max(rc.height(), max(lc.height(), tabHint.height()))
)
else:
size = QSize(
layoutHint.width() + max(rc.width(), max(lc.width(), tabHint.width())),
max(layoutHint.height(), tabHint.height() + rc.height() + lc.height())
)
return size
class Window(QWidget):
def __init__(self):
# ...
# no need to for a specific function, just directly call adjustSize()
self.tabs.currentChanged.connect(self.adjustSize)
Two small suggestions. 1) Avoid unnecessary line spacings in your code, as it is distracting. 2) __init__
should preferably go at the beginning of the class, without any custom function before it: it's the "initialization", and it should not go after other things.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…