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

PyQt5中QSplitter与多级Tab布局问题:右侧QFrame无法铺满窗口

解决QSplitter右侧QFrame无法铺满窗口的问题

问题根源在于StructureVariableControls类的布局设置错误:你创建了布局对象但未绑定到当前Widget,同时QFrame也没有加入布局,导致它无法随父容器自适应大小。

修复步骤

  • 给StructureVariableControls设置主布局:调用self.setLayout(self.layout)将创建的QVBoxLayout绑定到当前Widget
  • 移除布局的Qt.AlignTop对齐(该属性会让子控件仅居顶显示,无法拉伸铺满)
  • 将QFrame添加到主布局中,让布局管理它的大小

修改后的完整代码

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QSplitter, QTabWidget, QPlainTextEdit, \
    QHBoxLayout, QFrame, QTableWidget
from PyQt5.QtGui import QCloseEvent
from PyQt5.QtCore import Qt
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle('title')
        self.resize(1400, 800)

        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout(central_widget)

        splitter = QSplitter()
        main_layout.addWidget(splitter)

        # Left tabs for plots
        left_tab_widget = QTabWidget()
        self.left_tab_1 = QWidget()
        self.left_tab_2 = QWidget()
        self.left_tab_3 = QWidget()
        left_tab_widget.addTab(self.left_tab_1, "left 1")
        left_tab_widget.addTab(self.left_tab_2, "left 2")
        left_tab_widget.addTab(self.left_tab_3, "left 3")

        # Right tabs for GUI
        # main tabs
        right_tab_widget = QTabWidget()
        self.right_tab_1 = QWidget()
        self.right_tab_2 = QWidget()


        # child tabs
        right_tab_2_children = QTabWidget()
        self.right_tab_2_1 = QWidget()
        self.right_tab_2_2 = StructureVariableControls()

        right_tab_2_children.addTab(self.right_tab_2_1, "right 2_1")
        right_tab_2_children.addTab(self.right_tab_2_2, "right 2_2")

        right_tab_widget.addTab(self.right_tab_1, "right 1")
        right_tab_widget.addTab(right_tab_2_children, "right 2")

        splitter.addWidget(left_tab_widget)
        splitter.addWidget(right_tab_widget)

        right_tab_widget.setCurrentIndex(1)
        right_tab_2_children.setCurrentIndex(1)
        
        
class StructureVariableControls(QWidget):
    def __init__(self):
        super().__init__()
        # 移除AlignTop对齐,让布局默认拉伸子控件
        self.layout = QVBoxLayout()
        # 将布局设置为当前Widget的主布局
        self.setLayout(self.layout)

        self.frame = QFrame(self)
        self.frame.setFrameShape(QFrame.StyledPanel)
        self.frame.setFrameShadow(QFrame.Raised)
        self.frame.setStyleSheet("background-color: rgb(200, 200, 200);")
        self.frame.setLineWidth(10)

        # 将QFrame添加到主布局
        self.layout.addWidget(self.frame)

        self.frame_layout = QVBoxLayout(self.frame)
        self.table_widget = QTableWidget()
        self.frame_layout.addWidget(self.table_widget)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

额外优化(可选)

如果希望表格也能铺满QFrame,可以给表格设置拉伸属性,或者让布局自动填充空间:

# 在添加表格到frame_layout后添加
self.frame_layout.setContentsMargins(0,0,0,0)  # 移除布局内边距
self.table_widget.horizontalHeader().setStretchLastSection(True)
self.table_widget.horizontalHeader().setSectionResizeMode(QTableWidget.Stretch)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:44:55