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

