如何在PySide6的QDockWidget中添加滚动条并修复停靠问题
解决QDockWidget滚动条适配及停靠失效问题
问题分析
- 滚动条缺失:内部组件
My_wgt未使用滚动容器,内容超出窗口高度时无法滚动。 - 停靠功能异常:给内部组件设置
setFixedWidth(250)限制了QDockWidget的宽度调整,setFloating(False)固定了dock的浮动状态,导致交互受限。
解决方案
- 添加滚动条:将
My_wgt放入QScrollArea中,QScrollArea会自动根据内容和窗口大小显示滚动条。 - 修复停靠功能:移除内部组件的固定宽度设置,若需固定dock宽度,直接设置QDockWidget的最小/最大宽度;按需调整
setFloating的设置(允许浮动可去掉该设置或设为True)。
修改后的代码
import sys from PySide6.QtWidgets import * from PySide6.QtGui import * from PySide6.QtCore import * class My_wgt(QWidget): def __init__(self, parent=None): super().__init__(parent) layout = QVBoxLayout() lineedit_list = [QLabel(f"Line {i}") for i in range(30)] for label in lineedit_list: layout.addWidget(label) # 让布局内组件在窗口缩小时合理收缩 layout.addStretch() self.setLayout(layout) class My_wnd(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.setFixedHeight(500) self.dock = QDockWidget("Dock") # 若需要允许dock浮动,可注释掉下面这行或设为True # self.dock.setFloating(False) # 创建滚动容器包裹内部组件 scroll_area = QScrollArea() self.dock_in_wgt = My_wgt() scroll_area.setWidget(self.dock_in_wgt) # 允许滚动区域内的组件随容器大小调整 scroll_area.setWidgetResizable(True) self.dock.setWidget(scroll_area) self.dock.setAllowedAreas(Qt.RightDockWidgetArea) # 设置dock最小宽度,替代原内部组件的固定宽度限制 self.dock.setMinimumWidth(250) self.addDockWidget(Qt.RightDockWidgetArea, self.dock) if __name__ == "__main__": app = QApplication(sys.argv) main_window = My_wnd() main_window.show() sys.exit(app.exec())
关键修改说明
- 用
QScrollArea包裹自定义组件并启用setWidgetResizable(True),确保内容超出时自动显示滚动条,且组件能随容器大小调整。 - 将内部组件的固定宽度改为设置QDockWidget的最小宽度,既保留基础宽度限制,又不影响dock的停靠调整功能。
- 若需要dock支持浮动,移除
self.dock.setFloating(False)即可。
内容的提问来源于stack exchange,提问作者May Walon
相关产品推荐
相关产品推荐

