def sizeHint(self): """ Get the size hint for the scroll area. This reimplemented method fixes a Qt bug where the size hint is not updated after the scroll widget is first shown. The bug is documented on the Qt bug tracker: https://bugreports.qt-project.org/browse/QTBUG-10545 """ # This code is ported directly from QScrollArea.cpp but instead # of caching the size hint of the scroll widget, it caches the # size hint for the entire scroll area, and invalidates it when # the widget is changed or it receives a LayoutRequest event. hint = self._size_hint if hint.isValid(): return QSize(hint) fw = 2 * self.frameWidth() hint = QSize(fw, fw) font_height = self.fontMetrics().height() widget = self.widget() if widget is not None: if self.widgetResizable(): hint += widget.sizeHint() else: hint += widget.size() else: hint += QSize(12 * font_height, 8 * font_height) if self.verticalScrollBarPolicy() == Qt.ScrollBarAlwaysOn: vbar = self.verticalScrollBar() hint.setWidth(hint.width() + vbar.sizeHint().width()) if self.horizontalScrollBarPolicy() == Qt.ScrollBarAlwaysOn: hbar = self.horizontalScrollBar() hint.setHeight(hint.height() + hbar.sizeHint().height()) hint = hint.boundedTo(QSize(36 * font_height, 24 * font_height)) self._size_hint = hint return QSize(hint)