[PyQt] HeightForWidth label

Hans-Peter Jansen hpj at urpla.net
Wed Jan 9 21:00:57 GMT 2013


Dear Mads,

Am Mittwoch, 9. Januar 2013, 15:56:29 schrieb Mads Ipsen:
> Hi,
> 
> 4-5 years I needed a widget with the following properties:
> 
>   * Display text incl. HTML
>   * Text should be wrapped on several lines
>   * When the widget is put into a layout, the height of the widget
>     should be adjusted in such a way that the text exactly fits the
>     widget geometry
> 
> This subwidget should be used in a layout to provide some detail on how
> the other GUI elements in the layout work but only consume a minimum
> space to display its content.
> 
> I thought this was an easy one - but each time I return to the challenge
> I always end by giving up.
> 
> The main problem is that the layout breaks down when heightForWidth() is
> implemented and a QSizePolicy with setHeightForWidth(True) is used. It
> can shrink to infinitely small. Apparently this is Qt bug.

Yes, been there, done that, and failed in similar ways.

The best thing I could come up on this was:

use a QTextBrowser for the text:

        self.aboutText.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.aboutText.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.aboutText.setLineWrapMode(QtGui.QTextEdit.NoWrap)
        self.aboutText.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        self.aboutText.setHtml("...")

        w = self.aboutText.document().idealWidth()
        self.aboutText.document().setTextWidth(w)
        ds = self.aboutText.document().size()
        self.aboutText.setMinimumSize(int(ds.width() + 3), int(ds.height() + 3))
        self.aboutText.updateGeometry()
        self.layout().setSizeConstraint(QtGui.QLayout.SetFixedSize)

with this, you can even provide clickable links (but disable openLinks prop):

    @QtCore.pyqtSignature("const QUrl &")
    def on_aboutText_anchorClicked(self, url):
        QtGui.QDesktopServices.openUrl(url)

Maybe it gets you going..

Cheers,
Pete


More information about the PyQt mailing list