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

如何在PySide2中创建仅占QWidget一半区域的QScrollArea

解决QScrollArea与其他部件共存的布局问题

你遇到的RuntimeError核心原因是:Qt中同一个布局只能被一个父容器拥有——你先将vbox添加到了hbox布局,之后又尝试把vbox设置为widget的布局,这就导致布局被重复绑定,触发错误。

以下是修正后的代码,可实现滚动区域与其他静态部件并排显示的效果:

from PySide2.QtWidgets import (QWidget, QSlider, QLineEdit, QLabel, QPushButton, QScrollArea,QApplication,
                             QHBoxLayout, QVBoxLayout, QMainWindow)
from PySide2.QtCore import Qt
from PySide2 import QtWidgets
import sys


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建主容器Widget,作为整个窗口的内容载体
        main_widget = QWidget()
        # 主布局用横向布局,用于放置滚动区域和静态部件
        main_layout = QHBoxLayout(main_widget)

        # --- 构建滚动区域部分 ---
        scroll_area = QScrollArea()
        # 滚动区域的内容容器
        scroll_content = QWidget()
        scroll_layout = QVBoxLayout(scroll_content)

        # 向滚动区域添加示例标签
        for i in range(1, 50):
            label = QLabel(f"TextLabel {i}")
            scroll_layout.addWidget(label)

        # 配置滚动区域属性
        scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll_area.setWidgetResizable(True)
        scroll_area.setWidget(scroll_content)

        # --- 构建右侧静态部件部分 ---
        static_layout = QVBoxLayout()
        static_layout.addWidget(QPushButton("静态按钮1"))
        static_layout.addWidget(QLabel("这是静态文本"))
        static_layout.addWidget(QPushButton("静态按钮2"))
        # 静态布局需要依附于Widget才能添加到主布局
        static_widget = QWidget()
        static_widget.setLayout(static_layout)

        # --- 将两个部分添加到主布局 ---
        # stretch参数控制宽度占比,3表示滚动区域占3份,静态部件占1份
        main_layout.addWidget(scroll_area, stretch=3)
        main_layout.addWidget(static_widget, stretch=1)

        # 设置主容器为窗口中央部件
        self.setCentralWidget(main_widget)

        self.setGeometry(600, 100, 1000, 900)
        self.setWindowTitle('滚动区域+静态部件示例')
        self.show()


def main():
    app = QtWidgets.QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

关键修正说明:

  • 新增main_widget作为全局容器,主布局main_layout仅属于该容器,彻底避免布局归属冲突
  • 滚动区域的内部布局scroll_layout仅绑定到scroll_content,不再被其他布局引用
  • 静态部件必须放入独立的static_widget中,再添加到主布局(Qt规则:布局不能直接作为子元素添加到其他布局,必须依附于Widget)
  • 通过stretch参数可灵活调整滚动区域与静态部件的宽度比例,适配不同需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:13:19