def create_rect_path(data): path = QPainterPath() if data.get('rx') > 0 or data.get('ry'): path.addRoundedRect(data.get('x'), data.get('y'), data.get('w'), data.get('h'), data.get('rx'), data.get('ry')) else: path.addRect(data.get('x'), data.get('y'), data.get('w'), data.get('h')) if 'transform' in data: m = re.match('^matrix\\((.+)\\)$', data.get('transform')) if m: args = map(lambda x: float(x), m.group(1).split()) if len(args) == 6: transform = QTransform(*args) path *= transform return path
def paintEvent(self, event): painter = QPainter() painter.begin(self) painter.setRenderHint(painter.Antialiasing) font = painter.font() font.setBold(True) painter.setFont(font) x = self.rect().x() y = self.rect().y() w = self.rect().width() - 1 h = self.rect().height() - 1 _rect = 5 if self.rollout_style == AccordionStyle.ROUNDED: border_color = self.palette().color(QPalette.Light) header_color = QColor(self._theme.background_color).lighter(90) background_color = QColor(self._theme.background_color).lighter(135) painter.save() # pen = QPen(border_color) # pen.setWidthF(0.1) painter.setPen(Qt.NoPen) painter.setBrush(QBrush(background_color)) painter.drawRoundedRect(x + 1, y + 1, w - 1, h - 1, _rect, _rect) # pen.setColor(self.palette().color(QPalette.Shadow)) # painter.setPen(pen) # painter.drawRoundedRect(x, y, w - 1, h - 1, _rect, _rect) path = QPainterPath() path.setFillRule(Qt.WindingFill) path.addRoundedRect(x + 1, y + 1, w - 1, 20, _rect, _rect) if not self.is_collapsed(): path.addRect(x + 1, y + 16, w - 1, 5) painter.setBrush(QBrush(header_color)) painter.drawPath(path.simplified()) painter.restore() painter.drawText(x + 33 if not self._icon else 40, y + 3, w, 16, Qt.AlignLeft | Qt.AlignTop, self.title()) self._draw_triangle(painter, x, y) self._draw_icon(painter, x + 22, y + 3) elif self.rollout_style == AccordionStyle.SQUARE: painter.drawText(x + 33 if not self._icon else 40, y + 3, w, 16, Qt.AlignLeft | Qt.AlignTop, self.title()) self._draw_triangle(painter, x, y) self._draw_icon(painter, x + 22, y + 3) pen = QPen(self.palette().color(QPalette.Light)) pen.setWidthF(0.15) painter.setPen(pen) painter.drawRect(x + 1, y + 1, w - 1, h - 1) pen.setColor(self.palette().color(QPalette.Shadow)) painter.setPen(pen) elif self.rollout_style == AccordionStyle.MAYA: painter.drawText(x + 33 if not self._icon else 40, y + 3, w, 16, Qt.AlignLeft | Qt.AlignTop, self.title()) painter.setRenderHint(QPainter.Antialiasing, False) self._draw_triangle(painter, x, y) self._draw_icon(painter, x + 22, y + 3) header_height = 20 header_rect = QRect(x + 1, y + 1, w - 1, header_height) header_rect_shadow = QRect(x - 1, y - 1, w + 1, header_height + 2) pen = QPen(self.palette().color(QPalette.Light)) pen.setWidthF(0.4) # painter.setPen(pen) painter.setPen(Qt.NoPen) painter.drawRect(header_rect) painter.fillRect(header_rect, QColor(255, 255, 255, 18)) pen.setColor(self.palette().color(QPalette.Dark)) painter.setPen(pen) painter.drawRect(header_rect_shadow) if not self.is_collapsed(): # pen = QPen(self.palette().color(QPalette.Dark)) # pen.setWidthF(0.8) # painter.setPen(pen) offset = header_height + 3 body_rect = QRect(x, y + offset, w, h - offset) # body_rect_shadow = QRect(x + 1, y + offset, w + 1, h - offset + 1) painter.drawRect(body_rect) # pen.setColor(self.palette().color(QPalette.Light)) # pen.setWidth(0.4) # painter.setPen(pen) # painter.drawRect(body_rect_shadow) elif self.rollout_style == AccordionStyle.BOXED: if self.is_collapsed(): a_rect = QRect(x + 1, y + 9, w - 1, 4) b_rect = QRect(x, y + 8, w - 1, 4) text = '+' else: a_rect = QRect(x + 1, y + 9, w - 1, h - 9) b_rect = QRect(x, y + 8, w - 1, h - 9) text = '-' pen = QPen(self.palette().color(QPalette.Light)) pen = QPen(Qt.red) pen.setWidthF(0.6) painter.setPen(pen) painter.drawRect(a_rect) # pen.setColor(self.palette().color(QPalette.Shadow)) # painter.setPen(pen) painter.drawRect(b_rect) painter.setRenderHint(painter.Antialiasing, False) painter.setBrush(self.palette().color(QPalette.Window).darker(120)) painter.drawRect(x + 10, y + 1, w - 20, 16) painter.drawText(x + 16, y + 1, w - 32, 16, Qt.AlignLeft | Qt.AlignVCenter, text) painter.drawText(x + 10, y + 1, w - 20, 16, Qt.AlignCenter, self.title()) if self.drag_drop_mode: rect = self.get_drag_drop_rect() _layout = rect.left() _rect = rect.right() center_y = rect.center().y() for y in (center_y - 3, center_y, center_y + 3): painter.drawLine(_layout, y, _rect, y) painter.end()
def shape(self): path = QPainterPath() path.addRect(14, 14, 82, 42) return path