class TextWidget(QtGui.QGraphicsWidget): faded_opacity = .8 padding = 3 bg_color = QtGui.QColor(0,0,0,0) def __init__(self, timeout_seconds=0): super(TextWidget, self).__init__() self.setOpacity(self.faded_opacity) self.opaciter = OpacityAnimation(self) self.background = QtGui.QGraphicsRectItem(self) self.background.setBrush(QtGui.QBrush(self.bg_color)) self.background.setPen(QtGui.QPen(QtGui.QColor(0,0,0,0))) self.item = TextItem(self) self._timer = None self.timeout_seconds = timeout_seconds def sizeHint(self, which, constraint=None): #if which == QtCore.Qt.PreferredSize: if True: rect = self.item.boundingRect() size = QtCore.QSizeF(rect.width(), rect.height()) else: size = super(TextWidget, self).sizeHint(which, constraint) return size def setHtml(self, html): of = self.padding self.item.setHtml(html) rect = self.item.boundingRect() self.background.setRect(rect) self.updateGeometry() def show(self): if not self.opaciter.fadeTo(self.faded_opacity): self.opaciter.stop() self.opaciter.fadeTo(self.faded_opacity) if self.timeout_seconds: self.timer = QtCore.QTimer(self) self.timer.timeout.connect(self._hide) self.timer.setSingleShot(True) self.timer.start(self.timeout_seconds * 1000) def hide(self): if not self.opaciter.fadeTo(0): self.opaciter.stop() self.opaciter.fadeTo(0)