我试图找到一种方法让我的一个小部件根据其高度保持宽度。我有其他小部件正在重新实现 heightForWidth 方法。这很简单,因为该方法是标准的。我知道没有包含 widthForHeight 方法,所以我尝试了很多互联网建议的选项,但没有任何工作方式。我现在所拥有的几乎让我在那里。
我首先重新实现我的小部件的sizeHint,以使其宽度成为其父级(QHBoxLayout)高度的比率。
sizeHint使MyCustomLabel在首次显示时显示正确的大小,但在用户调整窗口大小时没有更新。我不知道这是否是最好的方法,但要解决这个问题,我正在重新实现resizeEvent并调用adjustSize来强制sizeHint重新计算。
使用这两个重新实现的方法MyCustomLabel显示正确的大小。我将这个自定义小部件放在QHBoxLayout中,并带有一些其他标准小部件。问题是当用户调整窗口大小时,布局中的其他小部件不会尊重MyCustomLabel的新大小。我最终得到的是布局中的其他小部件重叠或放置得离MyCustomLabel太远。我有点得到它,我粗暴地强迫我的小部件大小,而不是让布局做的工作。但是我想更新sizeHint会告知MyCustomLabel新大小的布局并相应地调整所有内容。我如何解决这个布局问题,或者我是否以错误的方式解决了这个widthForHeight问题?
修改 我试过@AlexanderVX建议将SizePolicy设置为Minimum,虽然它确实阻止其他小部件重叠,但它也将MyCustomLabel锁定为固定大小。我需要使用布局来扩展和缩小窗口小部件。我还尝试了Preferred,Expanding,MinimumExpanding策略,看看他们是否会做任何事情,但没有运气。
from __future__ import division
from PySide import QtCore
from PySide import QtGui
import sys
class MyCustomLabel(QtGui.QLabel):
clicked = QtCore.Signal(int)
dblClicked = QtCore.Signal(int)
def __init__(self, leadSide='height', parent=None):
super(MyCustomLabel, self).__init__()
self.leadSide = leadSide
# sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
# QtGui.QSizePolicy.Preferred)
# sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
# QtGui.QSizePolicy.Expanding)
# sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding,
# QtGui.QSizePolicy.MinimumExpanding)
# sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum,
# QtGui.QSizePolicy.Minimum)
# self.setSizePolicy(sizePolicy)
def resizeEvent(self, event):
super(MyCustomLabel, self).resizeEvent(event)
self.adjustSize()
def sizeHint(self):
super(MyCustomLabel, self).sizeHint()
parentSize = self.parent().size().toTuple()
if self.leadSide.lower() == 'height':
new_size = QtCore.QSize(parentSize[1] * (16 / 9), parentSize[1]) * .9
if self.leadSide.lower() == 'width':
new_size = QtCore.QSize(parentSize[0], parentSize[0] / (16 / 9)) * .9
return new_size
class __Test__(QtGui.QWidget):
def __init__(self):
super(__Test__, self).__init__()
self.initUI()
def initUI(self):
customLabel = MyCustomLabel(leadSide='height')
# customLabel.setScaledContents(True)
customLabel.setStyleSheet('background-color: blue;'
'border:2px solid red;')
btn01 = QtGui.QPushButton('button')
btn01.setFixedHeight(80)
textEdit = QtGui.QTextEdit()
textEdit.setFixedSize(150, 150)
layout01 = QtGui.QHBoxLayout()
layout01.setContentsMargins(0,0,0,0)
layout01.setSpacing(0)
layout01.addWidget(customLabel)
layout01.addWidget(btn01)
layout01.addWidget(textEdit)
self.setLayout(layout01)
self.setGeometry(300, 300, 600, 300)
self.setWindowTitle('Testing')
self.show()
def main():
app = QtGui.QApplication(sys.argv)
ex = __Test__()
sys.exit(app.exec_())
if __name__ == '__main__':
main()