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

PySide2创建QScrollArea时滚动条不显示、窗口高度固定无法调整问题求解

问题根源

  • 你创建的QScrollArea实例未被加入主布局,反而直接将滚动区域的内部承载部件_contentWidget加到了主布局,滚动组件完全没有生效,窗口高度直接被内部26个固定高度的按钮撑成了固定值,自然无法调整也没有滚动条。
  • 如果你需要标签页内部的内容单独滚动,还需要给每个标签页的内容也套一层滚动区域,避免标签页整体被撑到过高。

修复后的完整代码

from PySide2 import QtWidgets

class Test:
    def __init__(self):
        self._window = QtWidgets.QMainWindow()
        self._widget = QtWidgets.QWidget()
        self._window.resize(200, 400)
        self._window.setWindowTitle('My Scrollbar Test')
        self._window.setCentralWidget(self._widget)

        # Create a box layout
        self._mainLayout = QtWidgets.QVBoxLayout(self._widget)
        self._mainLayout.setContentsMargins(0,0,0,0)
        self._mainLayout.setSpacing(0)

        # Create a scroll area
        self._scrollAreaWidget = QtWidgets.QScrollArea()
        self._scrollAreaWidget.setWidgetResizable(True)

        # Assign a QWidget to the scroll widget
        self._contentWidget = QtWidgets.QWidget()
        self._scrollAreaWidget.setWidget(self._contentWidget)

        self._layout = QtWidgets.QVBoxLayout(self._contentWidget)

        # Add tabs
        self._tabWidget = QtWidgets.QTabWidget()
        self._tabWidget.addTab(self.createTabOneLayout(), 'Test 1')
        self._tabWidget.addTab(self.createTabOneLayout(), 'Test 2')
        self._tabWidget.setTabPosition(QtWidgets.QTabWidget.East)
        self._layout.addWidget(self._tabWidget)

        # 注意这里:把滚动区域加到主布局,而不是内部的_contentWidget
        self._mainLayout.addWidget(self._scrollAreaWidget)

        self._window.show()

    # Tab function
    def createTabOneLayout(self):
        self._newTab = QtWidgets.QWidget()
        self._tabLayout = QtWidgets.QVBoxLayout(self._newTab)       

        # 给每个标签页内部单独加滚动区域,实现标签内内容滚动
        scroll_area = QtWidgets.QScrollArea()
        scroll_area.setWidgetResizable(True)
        content_widget = QtWidgets.QWidget()
        content_layout = QtWidgets.QVBoxLayout(content_widget)

        # Add buttons
        for a in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
            self._newButton = QtWidgets.QPushButton(a)
            self._newButton.setFixedSize(50,50)
            content_layout.addWidget(self._newButton)

        scroll_area.setWidget(content_widget)
        self._tabLayout.addWidget(scroll_area)
        return self._newTab

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    t = Test()
    sys.exit(app.exec_())

关键修改说明

  • 将原来直接加_contentWidget到主布局的逻辑,改为加_scrollAreaWidget到主布局,让滚动组件正常生效。
  • 每个标签页内部新增了独立滚动区域,避免标签页整体高度被按钮撑到过大,你也可以根据需求调整为整体滚动,只需要移除标签内的滚动区域即可,窗口大小可以自由调整,内容超出时自动显示滚动条。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:45:05