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

