4-5 年我需要一个具有以下属性的小部件
- 显示文本包括。HTML
- 文本应分多行
- 将小部件放入布局时,应调整小部件的高度以使文本完全适合小部件几何形状
此子小部件应在布局中使用,以提供有关布局中其他 GUI 元素如何工作的一些详细信息,但仅占用最小空间来显示其内容。
我认为这很容易——但每次我回到挑战中,我总是以放弃告终。
主要问题是在实现 heightForWidth() 并使用带有 setHeightForWidth(True) 的 QSizePolicy 时布局会崩溃。它可以缩小到无限小。显然这是 Qt 错误。
另一种方法是在发生 resizeEvent() 时调用 updateGeometry() 并使用与宽度相关的高度调用 setFixedHeight(h)。但这也引起了一些奇怪的布局行为。
如果有人对如何解决这个问题有任何好的建议,请告诉我。
下面我包含一个片段,它重现了布局调整大小的行为。
此致,
麦兹
import sys
from PyQt4 import QtCore, QtGui
class Square(QtGui.QLabel):
def __init__(self, parent=None):
QtGui.QLabel.__init__(self, parent)
self.setAutoFillBackground(True)
palette = QtGui.QPalette()
palette.setColor(QtGui.QPalette.Window, QtGui.QColor('red'))
self.setPalette(palette)
policy = self.sizePolicy()
policy.setHeightForWidth(True)
self.setSizePolicy(policy)
def sizeHint(self):
return QtCore.QSize(128, 128)
def heightForWidth(self, width):
return width
class Widget(QtGui.QWidget):
def __init__(self, parent=None):
# Call base class constructor
QtGui.QWidget.__init__(self, parent)
# Add a layout
layout = QtGui.QVBoxLayout()
self.setLayout(layout)
# Add Square
label = Square()
layout.addWidget(label)
spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
layout.addItem(spacerItem)
# Some dummy button
self._push_button = QtGui.QPushButton('Press me')
layout.addWidget(self._push_button)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec_())