def paint(self, painter, option, index): super(Delegate, self).paint(painter, option, index) # HOVER if option.state & QStyle.State_MouseOver: painter.fillRect(option.rect, QColor("#F1F1F1")) else: painter.fillRect(option.rect, Qt.transparent) # SELECTED if option.state & QStyle.State_Selected: painter.fillRect(option.rect, QColor("#F1F1F1")) # DRAW ICON icon = QPixmap() icon.load(index.data()[1]) icon = icon.scaled(24, 24, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) left = 24 # margin left icon_pos = QRect(left, ((self._height - icon.height()) / 2) + option.rect.y(), icon.width(), icon.height()) painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.SmoothPixmapTransform) painter.drawPixmap(icon_pos, icon) # DRAW TEXT font = QFont("Roboto Black", 12) text_pos = QRect((left * 2) + icon.width(), option.rect.y(), option.rect.width(), option.rect.height()) painter.setFont(font) painter.setPen(Qt.black) painter.drawText(text_pos, Qt.AlignVCenter, index.data()[0])
def paintEvent(self, event): super(Profile, self).paintEvent(event) # DRAW BACKGROUND IMAGE p = QPainter(self) p.setRenderHint(QPainter.Antialiasing) image = QPixmap() image.load("res/img/back.jpg") image = image.scaled(self.width(), self.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation) p.drawPixmap(self.rect(), image)
def paintAvatar(self): # DRAW PROFILE IMAGE image = QPixmap() image.load("res/img/icons/user.png") image = image.scaled(54, 54, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) _margin = 16 _margin_text = 24 self.avatar = QLabel(self) self.avatar.setCursor(Qt.PointingHandCursor) self.avatar.setAttribute(Qt.WA_TranslucentBackground) self.avatar.setPixmap(image) self.avatar.move(self.rect().x() + _margin, self.rect().y() + _margin) self.username = QLabel(self) self.username.setStyleSheet("color: white;") self.username.setFont(QFont("Roboto Light", 14)) self.username.setCursor(Qt.PointingHandCursor) self.username.setAttribute(Qt.WA_TranslucentBackground) self.username.setText("dryerem19") self.username.move(self.rect().x() + _margin_text, self.height() - 50)
class RenderArea(QWidget): points = QPolygon( [QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70)]) Line, Points, Polyline, Polygon, Rect, RoundedRect, Ellipse, Arc, Chord, \ Pie, Path, Text, Pixmap = range(13) def __init__(self, parent=None): super(RenderArea, self).__init__(parent) self.pen = QPen() self.brush = QBrush() self.pixmap = QPixmap() self.shape = RenderArea.Polygon self.antialiased = False self.transformed = False self.pixmap.load(':/images/qt-logo.png') self.setBackgroundRole(QPalette.Base) self.setAutoFillBackground(True) def minimumSizeHint(self): return QSize(100, 100) def sizeHint(self): return QSize(400, 200) def setShape(self, shape): self.shape = shape self.update() def setPen(self, pen): self.pen = pen self.update() def setBrush(self, brush): self.brush = brush self.update() def setAntialiased(self, antialiased): self.antialiased = antialiased self.update() def setTransformed(self, transformed): self.transformed = transformed self.update() def paintEvent(self, event): rect = QRect(10, 20, 80, 60) path = QPainterPath() path.moveTo(20, 80) path.lineTo(20, 30) path.cubicTo(80, 0, 50, 50, 80, 80) startAngle = 30 * 16 arcLength = 120 * 16 painter = QPainter(self) painter.setPen(self.pen) painter.setBrush(self.brush) if self.antialiased: painter.setRenderHint(QPainter.Antialiasing) for x in range(0, self.width(), 100): for y in range(0, self.height(), 100): painter.save() painter.translate(x, y) if self.transformed: painter.translate(50, 50) painter.rotate(60.0) painter.scale(0.6, 0.9) painter.translate(-50, -50) if self.shape == RenderArea.Line: painter.drawLine(rect.bottomLeft(), rect.topRight()) elif self.shape == RenderArea.Points: painter.drawPoints(RenderArea.points) elif self.shape == RenderArea.Polyline: painter.drawPolyline(RenderArea.points) elif self.shape == RenderArea.Polygon: painter.drawPolygon(RenderArea.points) elif self.shape == RenderArea.Rect: painter.drawRect(rect) elif self.shape == RenderArea.RoundedRect: painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize) elif self.shape == RenderArea.Ellipse: painter.drawEllipse(rect) elif self.shape == RenderArea.Arc: painter.drawArc(rect, startAngle, arcLength) elif self.shape == RenderArea.Chord: painter.drawChord(rect, startAngle, arcLength) elif self.shape == RenderArea.Pie: painter.drawPie(rect, startAngle, arcLength) elif self.shape == RenderArea.Path: painter.drawPath(path) elif self.shape == RenderArea.Text: painter.drawText(rect, Qt.AlignCenter, "PySide 2\nQt %s" % qVersion()) elif self.shape == RenderArea.Pixmap: painter.drawPixmap(10, 10, self.pixmap) painter.restore() painter.setPen(self.palette().dark().color()) painter.setBrush(Qt.NoBrush) painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
class ItemInfoBox(QWidget): def __init__(self, item: Item): super().__init__() layout = QGridLayout(self) meta = item.meta # infobox spans one row and two columns. SPAN = (1, 2) # wikipedia-style info box at the side title = TitleLabel(f"<h2><i>{meta.title}</i></h2>") layout.addWidget(title, 0, 0, *SPAN) self.cover = QPixmap() try: manga_path = CACHE.root / meta.hash cover_path = next(manga_path.glob("cover.*")) except StopIteration: self.cover.load(":/missing.jpg") else: self.cover.load(str(cover_path)) self.cover = self.cover.scaled( int(self.width() / 2), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation, ) self.cover_label = QLabel() self.cover_label.setScaledContents(True) self.cover_label.setPixmap(self.cover) layout.addWidget(self.cover_label, 1, 0, *SPAN) if meta.alt_titles is not None: _alt_titles = "<br>".join(f"<i>{t}</i>" if _is_ascii(t) else t for t in meta.alt_titles) else: _alt_titles = "(empty)" alt_titles = TitleLabel(_alt_titles) alt_titles.setStyleSheet("background-color: #DDDDFF; color: black;") layout.addWidget(alt_titles, 2, 0, *SPAN) genre_header = SubtitleLabel("Genre") layout.addWidget(genre_header, 3, 0) if meta.genres is not None: _genres = "<br>".join(_normalize(g) for g in meta.genres) else: _genres = "(empty)" genres = QLabel(_genres) layout.addWidget(genres, 3, 1) manga_header = TitleLabel("<b>Manga</b>") layout.addWidget(manga_header, 4, 0, *SPAN) author_header = SubtitleLabel("Authored by") layout.addWidget(author_header, 5, 0) if meta.authors is not None: _authors = "<br>".join(a for a in meta.authors) else: _authors = "(empty)" authors = QLabel(_authors) layout.addWidget(authors, 5, 1) source_header = SubtitleLabel("Source") layout.addWidget(source_header, 6, 0) source = QLabel(f'<a href="{meta.url}">{meta.url}</b>') source.setWordWrap(True) source.setOpenExternalLinks(True) layout.addWidget(source, 6, 1) langs_header = SubtitleLabel("Languages") layout.addWidget(langs_header, 7, 0) manga = CACHE[meta.hash] langs_set = set() for chapter in manga["chapters"].values(): langs_set.update(chapter.keys()) langs = QLabel("<br>".join(common.describe_langs(list(langs_set)))) layout.addWidget(langs, 7, 1)