4-5 лет Мне нужен виджет со следующими свойствами
- Показать текст вкл. HTML
- Текст должен быть обернут несколькими строками
- Когда виджет помещается в макет, высота виджета должна быть отрегулирована таким образом, чтобы текст точно соответствовал геометрии виджета
Этот субвиджет должен использоваться в макете, чтобы предоставить некоторые детали о том, как работают другие элементы GUI в макете, но только потребляет минимальное пространство для отображения его содержимого.
Я думал, что это было легко, но каждый раз, когда я возвращаюсь к вызову, я всегда заканчиваю, отказываясь.
Основная проблема заключается в том, что макет разбивается при реализации heightForWidth() и используется QSizePolicy с setHeightForWidth (True). Он может сжиматься до бесконечно малой. По-видимому, это ошибка Qt.
Другой подход - вызвать updateGeometry (), когда возникает resizeEvent() и вызывает 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_())