PyQt5 QMainWindow调用setCentralWidget后中心部件仍不显示问题
解决QMainWindow中心网格部件不显示的问题
我来帮你搞定这个问题!看了你的代码后,发现核心问题有两个:自定义QWidget子类用样式表时没重写paintEvent,还有创建的测试标签没添加到布局里。下面是修复后的完整代码,之后我会详细拆解每个问题点:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QLabel, QGridLayout from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QStyleOption class Board(QWidget): def __init__(self): super().__init__() # 给自定义部件设置最小尺寸,确保布局能分配足够空间 self.setMinimumSize(200, 200) def paintEvent(self, event): # 重写paintEvent让样式表生效 painter = QPainter(self) opt = QStyleOption() opt.initFrom(self) self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self) super().paintEvent(event) class Clock(QWidget): def __init__(self): super().__init__() self.setMinimumSize(100, 100) def paintEvent(self, event): painter = QPainter(self) opt = QStyleOption() opt.initFrom(self) self.style().drawPrimitive(QStyle.PE_Widget, opt, painter, self) super().paintEvent(event) class MainGrid(QWidget): def __init__(self): super().__init__() self.initGrid() def initGrid(self): grid= QGridLayout() test = QLabel('test') board = Board() clock = Clock() board.setStyleSheet('background-color: pink') clock.setStyleSheet('background-color: blue') # 把测试标签添加到布局,验证布局是否正常工作 grid.addWidget(test, 0, 0) grid.addWidget(board, 2, 1, 10, 10) grid.addWidget(clock, 13, 4, 3, 3) self.setLayout(grid) class MainWin(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): centralGrid = MainGrid() centralGrid.setStyleSheet('background-color: red') self.setCentralWidget(centralGrid) self.setGeometry(200, 100, 1000, 600) self.setWindowTitle('Simple Checkers') self.show() if __name__ == '__main__': app = QApplication(sys.argv) gui = MainWin() sys.exit(app.exec_())
关键修复点解析:
自定义QWidget子类必须重写
paintEvent才能让样式表生效
Qt的QWidget默认paintEvent不会处理样式表的绘制逻辑,所以你给Board和Clock设置的背景色根本不会显示。重写paintEvent并调用style().drawPrimitive,就能让样式表的背景、边框等设置正常渲染,同时也能让部件拥有基础尺寸(不然没有内容也没有样式绘制的话,部件会缩成0尺寸,自然看不见)。测试标签未添加到布局
你创建了test标签但没调用grid.addWidget(test)把它加入布局,这个本来可以用来验证布局是否正常工作的元素没显示,反而让你更难排查问题。现在把它加入布局后,你能立刻看到这个标签,确认布局已经在正常运行了。给自定义部件设置最小尺寸(可选但推荐)
虽然布局会根据内容分配空间,但自定义部件如果没有子元素的话,默认尺寸可能极小。设置setMinimumSize可以确保这些部件在布局里有足够的显示空间,方便你直观看到它们的样式效果。
内容的提问来源于stack exchange,提问作者nzz coding
相关产品推荐
相关产品推荐

