6

4-5 年 次のプロパティを持つウィジェットが必要でした

  • 表示テキスト込み。HTML
  • テキストは複数行で折り返す必要があります
  • ウィジェットをレイアウトに配置する場合、テキストがウィジェットのジオメトリに正確に収まるように、ウィジェットの高さを調整する必要があります。

このサブウィジェットは、レイアウト内の他の GUI 要素がどのように機能するかについての詳細を提供するためにレイアウトで使用する必要がありますが、そのコンテンツを表示するために最小限のスペースしか消費しません。

これは簡単なことだと思っていましたが、チャレンジに戻るたびに、いつも諦めてしまいます。

主な問題は、heightForWidth() が実装され、setHeightForWidth(True) を持つ QSizePolicy が使用されると、レイアウトが崩れることです。無限に小さく縮小できます。どうやらこれは Qt のバグです。

もう 1 つの方法は、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_())
4

2 に答える 2