Python QWidget在布局分配时变为不可见

Python QWidget在布局分配时变为不可见,python,pyside2,Python,Pyside2,我正在使用QGridLayout创建一个自定义窗口来放置窗口元素:如标题栏、大小夹点等 当我为我的小部件设置any布局时,它不会在开始时显示。 如果我设置.setVisible(True),效果很好 所以问题是:为什么会发生这种情况,为什么小部件在布局分配时变得不可见? 这是一种bug还是它的构想 小部件文件是: 从PySide2导入QtWidgets、QtGui、QtCore 类QCustomWindow(QtWidgets.QWidget): 定义初始化(自): super()。\uuuu

我正在使用QGridLayout创建一个自定义窗口来放置窗口元素:如标题栏、大小夹点等

当我为我的小部件设置any布局时,它不会在开始时显示。 如果我设置
.setVisible(True)
,效果很好

所以问题是:为什么会发生这种情况,为什么小部件在布局分配时变得不可见? 这是一种bug还是它的构想

小部件文件是:

从PySide2导入QtWidgets、QtGui、QtCore
类QCustomWindow(QtWidgets.QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.background_color=QtGui.QColor(23,23,34)
self._initUI()
定义初始值(自):
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
打印(self.isVisible())
#self.setVisible(True)
#在没有布局的情况下是可见的
self.setLayout(qtwidts.QGridLayout())
self.layout().setMargin(0)
self.layout().setspace(0)
# ---------------------------------------
def showEvent(self,事件:QtGui.QShowEvent):
self.centerOnScreen()
def paintEvent(self,事件:QtGui.QPaintEvent):
painter=QtGui.QPainter(自)
画家。挫折(自身背景色)
painter.setPen(QtCore.Qt.NoPen)
painter.drawRect(0,0,self.width(),self.height())
def中心屏幕显示(自):
screen=qtwidts.QDesktopWidget()
屏幕几何=屏幕。屏幕几何(自身)
screen\u center\u x=screen\u geometry.center().x()
screen\u center\u y=screen\u geometry.center().y()
self.move(屏幕\u中心\u x-self.width()//2,
屏幕\u中心\u y-self.height()//2)
应用程序文件为:

从PySide2导入QtWidgets
从QCustomWindow导入QCustomWindow
导入系统
app=qtwidts.QApplication(sys.argv)
window=QCustomWindow()
window.show()
sys.exit(app.exec_())

除非必要,否则Qt不会更新几何体,或者强迫他这样做,并且出于效率原因,Qt会这样做。因此,如果未调用
setVisible(True)
或等效方法,则几何图形不会更改

如果不调用setVisible(True),则当父窗口小部件可见时,将重新计算大小,此时窗口小部件将分析QSizePolicy、QLayouts等信息。在您的特定情况下,具有首选项的窗口小部件具有布局,布局根据添加到其中的小部件计算大小,但在您的情况下,它没有添加小部件,因此布局计算的几何体为0x0,使其不可见。因此,如果您将小部件添加到QGridLayout,您将不会看到这个问题

但是,如果调用
setVisible(True)
则此时会计算几何图形,因为此时没有布局,因此会使用sizeHint,默认情况下,它是640x480,因此是可见的。当建立布局时,容器大小等于先前大小和布局提供的大小的最大值

总结:
  • 为什么小部件在布局分配时不可见?

    如果小部件中设置了布局,那么容器小部件的大小将是分配给布局的小部件确定的大小,在您的情况下,由于没有布局,因此大小为0x0

  • 这是某种缺陷还是它的构想?

    不,这不是错误,而是预期的行为。添加窗口小部件或设置显示窗口的大小