Source code for pcdsutils.qt.lazy
from typing import ClassVar, Optional
from qtpy import QtCore, QtGui, QtWidgets
[docs]
class LazyWidget(QtWidgets.QWidget):
"""
A lazy widget which only is created when first shown.
Parameters
----------
widget_cls : QtWidgets.QWidget subclass
The widget class to instantiate.
"""
widget_cls: type[QtWidgets.QWidget]
widget: Optional[QtWidgets.QWidget]
widget_created: ClassVar[QtCore.Signal] = QtCore.Signal(QtWidgets.QWidget)
widget_shown: ClassVar[QtCore.Signal] = QtCore.Signal()
widget_hidden: ClassVar[QtCore.Signal] = QtCore.Signal()
[docs]
def __init__(self, widget_cls: type[QtWidgets.QWidget]):
super().__init__()
self.widget_cls = widget_cls
self.widget = None
self.setVisible(False)
self.setLayout(QtWidgets.QVBoxLayout())
def hideEvent(self, event: QtGui.QHideEvent):
"""Hook for when the tool is hidden."""
super().hideEvent(event)
self.widget_hidden.emit()
def _create_widget(self):
"""Make the widget no longer lazy."""
if self.widget is not None:
return
self.widget = self.widget_cls()
self.layout().addWidget(self.widget)
self.setSizePolicy(self.widget.sizePolicy())
self._widget_created.emit(self.widget)
def showEvent(self, event: QtGui.QShowEvent):
"""Hook for when the tool is shown in the suite."""
if self.widget is None:
self._create_widget()
super().showEvent(event)
self.widget_shown.emit()
def minimumSizeHint(self):
"""Minimum size hint forwarder from the embedded widget."""
if self.widget is not None:
return self.widget.minimumSizeHint()
return self.sizeHint()
def sizeHint(self):
"""Size hint forwarder from the embedded widget."""
if self.widget is not None:
return self.widget.sizeHint()
return QtCore.QSize(100, 100)