如何使父窗口小部件的大小不适应子窗口小部件?

How to make the size of the parent widget not adjust to the child?

我希望子窗口小部件以水平粉红色条纹出现在父窗口小部件的中心。但是parent的widget变小了。

from PySide6 import QtWidgets, QtGui
import sys


class WidgetA(QtWidgets.QWidget):
    def __init__(self):
        super(WidgetA, self).__init__()
        self.wb = WidgetB()
        vbox = QtWidgets.QVBoxLayout()
        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(self.wb)
        vbox.addLayout(hbox)
        self.setLayout(vbox)


class WidgetB(QtWidgets.QWidget):
    def __init__(self):
        super(WidgetB, self).__init__()
        palette = self.palette()
        palette.setColor(QtGui.QPalette.Window, QtGui.QColor("#ff00ff"))
        self.setPalette(palette)


app = QtWidgets.QApplication()
window = WidgetA()
window.show()
sys.exit(app.exec())

如果我没有写什么,或者我的问题有什么不清楚的地方,再问,我会补充的。

window 看起来很小,因为您的示例脚本从未为 parent 或 child 设置明确的大小。直接设置 child 的几何形状不会有帮助,因为它在布局中,并且布局会自动管理它包含的小部件的几何形状。如果不想给child widget一个最小尺寸,可以使用spacers和stretch factors来控制space the child widget占用的比例向上。请参阅 Qt 文档中的 Layout Management article,以获得对所有可能性的全面概述。

下面是您的示例的重写,它应该按照您的要求进行(即使“child 小部件...出现在 parent 小部件的中心,带有水平粉红色条纹”)。但请注意,child 小部件的高度是 比例 ,因此每当手动调整 parent 小部件的大小时,布局将相应地调整其大小。如果您想要不同的比例,请更改拉伸系数以适应。我还重新实现了 sizeHint。这为 child 提供了一个合理的初始大小,同时允许它保持可自由调整大小 - 但您也可以只显式设置 parent window 的几何形状来实现几乎相同的事情。

from PySide6 import QtCore, QtWidgets, QtGui

class WidgetA(QtWidgets.QWidget):
    def __init__(self):
        super(WidgetA, self).__init__()
        self.wb = WidgetB()
        vbox = QtWidgets.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addWidget(self.wb, 2)
        vbox.addStretch(1)
        self.setLayout(vbox)

class WidgetB(QtWidgets.QWidget):
    def __init__(self):
        super(WidgetB, self).__init__()
        palette = self.palette()
        palette.setColor(QtGui.QPalette.Window, QtGui.QColor("#ff00ff"))
        self.setAutoFillBackground(True)
        self.setPalette(palette)

    def sizeHint(self):
        return QtCore.QSize(300, 200)

app = QtWidgets.QApplication(['Test'])
window = WidgetA()
window.show()
app.exec()