如何使父窗口小部件的大小不适应子窗口小部件?
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()
我希望子窗口小部件以水平粉红色条纹出现在父窗口小部件的中心。但是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()