def __init__(self, title, bg_color=bg_color): super(TitledTextWidget, self).__init__() self.title = title self.body = '' self.background = QtGui.QGraphicsRectItem(self) self.sizer = PropAnimation(self, 'size', force=True) if self.focusable: self.background.setPen(self.focus_pen) self._body_hidden = True if self.selectable: self.setFocusPolicy(QtCore.Qt.StrongFocus) else: self._body_hidden = False self._body_text = TextWidget() self._body_text.setParentItem(self) self._title_text = TextWidget() self._title_text.setParentItem(self) self.background.setBrush(QtGui.QBrush(bg_color)) self.setHtml()
class TitledTextWidget(QtGui.QGraphicsWidget): padding = 5 bg_color = QtGui.QColor('gray') bg_color.setAlpha(220) focus_pen = QtGui.QPen(QtGui.QColor('yellow')) focus_pen.color().setAlpha(128) focusable = True selectable = True lost_focus = QtCore.pyqtSignal(QtGui.QGraphicsWidget) gained_focus = QtCore.pyqtSignal(QtGui.QGraphicsWidget) size_change = QtCore.pyqtSignal(QtGui.QGraphicsWidget, QtCore.QSizeF) def __init__(self, title, bg_color=bg_color): super(TitledTextWidget, self).__init__() self.title = title self.body = '' self.background = QtGui.QGraphicsRectItem(self) self.sizer = PropAnimation(self, 'size', force=True) if self.focusable: self.background.setPen(self.focus_pen) self._body_hidden = True if self.selectable: self.setFocusPolicy(QtCore.Qt.StrongFocus) else: self._body_hidden = False self._body_text = TextWidget() self._body_text.setParentItem(self) self._title_text = TextWidget() self._title_text.setParentItem(self) self.background.setBrush(QtGui.QBrush(bg_color)) self.setHtml() def mousePressEvent(self, event): if not self.focusable: return if self._body_hidden: self.focusInEvent(None) else: self.focusOutEvent(None) def getSize(self): return self.background.boundingRect().size() def setSize(self, size): r = self.background.boundingRect() self.background.setRect(r.x(), r.y(), size.width(), size.height()) self.updateGeometry() size = QtCore.pyqtProperty(QtCore.QSizeF, getSize, setSize) def focusInEvent(self, event): self._body_hidden = False self.background.setPen(self.focus_pen) self.setHtml() self.gained_focus.emit(self) def focusOutEvent(self, event): self._body_hidden = True self.background.setPen(QtGui.QPen(QtGui.QColor(0,0,0,0))) self.setHtml() self.lost_focus.emit(self) def sizeHint(self, which, constraint=None): rect = self.background.rect() size = QtCore.QSizeF(rect.width(), rect.height()) return size def setHtml(self): self._title_text.setHtml(self.title) self._body_text.setHtml(self.body) tbox = self._title_text.item.boundingRect() bbox = self._body_text.item.boundingRect() x, y = min(tbox.x(), bbox.x()), min(tbox.y(), bbox.y()) w = max(tbox.width(), bbox.width()) h1, h2 = tbox.height(), bbox.height() if self._body_hidden: self._body_text.hide() h2, pad = 0, 0 else: self._body_text.show() pad = self.padding self._body_text.setPos(self.padding, h1) rect = QtCore.QRectF(x, y, w, h1 + pad + h2) size = QtCore.QSizeF(rect.width(), rect.height()) self.sizer.setup(size) self.sizer.start() self.size_change.emit(self, size)