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

PyQt5:如何在QFormLayout中正确显示QGridLayout?

问题:QGridLayout添加到QFormLayout后不显示

我正在开发一个PyQt5表单,初始元素均可正常显示,但尝试添加用于展示图案列表的QGridLayout时遇到问题。运行代码后仅显示"test"标签,网格组件不显示;但单独将grid_widget设为中心部件,或添加到game_types_page布局时,网格可正常显示。请问如何将QGridLayout正确添加到QFormLayout中?

测试代码

def show_game_types(self):
    self.game_types = loadJSONFromFile(game_types_file)
    self.setStyleSheet("")
    game_types_page = QVBoxLayout()
    game_types_page.setContentsMargins(30, 30, 30, 10)
    game_types_page.setSpacing(0)
    # creating a group box
    self.gameTypesFormBox = QGroupBox("Game Types")
    self.gameTypesFormBox.setStyleSheet("font-size: 14px; font-weight: bold;")
    regular_font = "font-size: 11px; font-weight: normal;"
    titles_style = "font-size: 12px; font-weight: bold;"

    self.gt_layout = QFormLayout()

    create_new_gt_button = QPushButton("Create New")
    create_new_gt_button.setStyleSheet(regular_font)
    create_new_gt_button.clicked.connect(self.save_new_game_type)

    self.create_new_gt_textbox = QLineEdit()
    self.create_new_gt_textbox.setMinimumWidth(600)
    self.create_new_gt_textbox.setStyleSheet(regular_font)

    add_patterns_label = QLabel("Modify game type patterns")
    add_patterns_label.setStyleSheet(titles_style)
    self.this_gt_combo = QComboBox()
    self.this_gt_combo.setStyleSheet(regular_font)
    self.this_gt_combo.addItem("-- Select game type --")
    self.this_gt_combo.currentTextChanged.connect(self.load_gt_patterns)
    for type in range(len(self.game_types)):
        self.this_gt_combo.addItem(self.game_types[type]["name"])
    
    self.gt_layout.addRow(self.create_new_gt_textbox, create_new_gt_button)
    self.gt_layout.addRow(add_patterns_label)
    self.gt_layout.addRow(self.this_gt_combo)

    self.selected_label = QLabel("")
    self.gt_layout.addRow(self.selected_label)

    # for pattern in selected game patterns populate a grid
    # start with a blank for "new"
    self.grid_widget = QWidget()
    self.pattern_grid = QGridLayout()
    test = Color('red')
    self.pattern_grid.addWidget(test, 0, 0)
    test2 = Color('blue')
    self.pattern_grid.addWidget(test2, 0, 1)

    self.grid_widget.setLayout(self.pattern_grid)
    self.gt_layout.addRow(QLabel("test"), self.grid_widget)

    self.buttonBox = QDialogButtonBox(QDialogButtonBox.Cancel)
    self.buttonBox.rejected.connect(self.showHomePage)

    self.gameTypesFormBox.setLayout(self.gt_layout)
    game_types_page.addWidget(self.gameTypesFormBox)
    game_types_page.addWidget(self.buttonBox)

    widget = QWidget()
    widget.setLayout(game_types_page)
    self.setCentralWidget(widget)

Color类代码

class Color(QWidget):
    def __init__(self, color):
        super(Color, self).__init__()
        self.setAutoFillBackground(True)
        self.color = color

        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(self.color))
        self.setPalette(palette)

解决方案

问题根源:自定义的Color部件没有设置明确的尺寸,导致QGridLayout无法计算布局空间,进而使得包含它的grid_widget在QFormLayout中被挤压至不可见。

可以通过以下两种方式解决:

方式1:给Color部件设置固定尺寸

修改创建Color实例的代码,为每个Color部件添加固定大小:

test = Color('red')
test.setFixedSize(50, 50)  # 设置固定宽高
self.pattern_grid.addWidget(test, 0, 0)
test2 = Color('blue')
test2.setFixedSize(50, 50)
self.pattern_grid.addWidget(test2, 0, 1)

方式2:给grid_widget设置最小尺寸或尺寸策略

如果不想固定Color部件的大小,可以给grid_widget设置最小尺寸,确保布局能识别它的存在:

self.grid_widget.setMinimumSize(120, 60)  # 根据需求调整数值

或者设置尺寸策略,让它在布局中自动扩展:

self.grid_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)

两种方法都能让QFormLayout正确计算grid_widget的布局空间,从而正常显示网格组件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:55:21