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

